Z
ZHANK
所有权与借用

切片 Slice

&[T] 切片、字符串切片 &str、Range 语法、切片方法

切片 Slice

切片是对集合中连续元素的引用——不拥有数据,只"借用"一部分。

学完本章你将: 掌握 &[T] 数组切片、&str 字符串切片、Range 语法。


数组切片 &[T]

rust
fn main() {
    let arr = [1, 2, 3, 4, 5];

    let slice: &[i32] = &arr[1..4];  // [2, 3, 4]
    println!("{:?}", slice);

    // Range 语法
    &arr[..]    // 全部
    &arr[..3]   // 前 3 个 [1,2,3]
    &arr[2..]   // 从索引 2 到最后 [3,4,5]
    &arr[1..=3] // [2,3,4](含末尾)
}

字符串切片 &str

rust
let s = String::from("Hello World");

let hello: &str = &s[0..5];   // "Hello"
let world: &str = &s[6..11];  // "World"
let all: &str = &s[..];       // "Hello World"

// 字符串字面量就是 &str
let literal: &str = "Hello";  // &str——存储在二进制文件的只读区

切片作为函数参数

rust
// ✅ 用 &str 代替 &String——更通用
fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }
    &s[..]
}

let s = String::from("Hello World");
let word = first_word(&s);  // 传 &String——自动转 &str(Deref)
println!("{}", word);       // "Hello"