方唐镜

大人,你看这张契约(String),上面写着“包家...欠...银两...万”。我只给您看这一小段(Slice)。

包龙星

大胆方唐镜!竟敢断章取义!把整张契约拿来!

豹子头 (雷豹)

别吵了!切片 (Slice) 只是原数据的一个引用,它不拥有数据,只是借来看一眼其中一段而已!

Rust Slice:断章取义的艺术

切片 (Slice) 是一个没有所有权的数据类型。切片允许你引用集合中一段连续的元素序列,而不是引用整个集合。

🍰 字符串切片 (&str)

String 是完整的字符串对象,而 &str 通常是字符串切片。

fn main() {
    let s = String::from("Hello world");

    let hello = &s[0..5]; // 引用前5个字节
    let world = &s[6..11]; // 引用第6到11个字节

    println!("{}, {}", hello, world);
}

📏 Range 语法 (..)

🚫 切片防止悬垂引用

因为切片是对原数据的引用,如果原数据被销毁或修改了,切片就会失效。Rust 编译器会保证这一点。

fn main() {
    let mut s = String::from("hello");
    let word = &s[..]; // word 借用了 s

    // s.clear(); // ❌ 报错!因为 s 还在被 word 借用,不能修改!
    
    println!("Word is: {}", word);
}

🧩 其他类型的切片

切片不仅用于字符串,还可以用于数组。

fn main() {
    let a = [1, 2, 3, 4, 5];
    let slice = &a[1..3]; // 类型是 &[i32]

    assert_eq!(slice, &[2, 3]);
}
📜

动手时刻:断句练习

编写一个程序,提取一句成语的后半部分。

  1. 创建一个字符串 idiom,值为 "九品芝麻官"。
  2. 使用切片语法,创建一个新的变量 official,只包含 "芝麻官" 三个字。
  3. 注意:UTF-8 字符通常占 3 个字节,小心切在字符中间会导致 panic!"九品" 是 6 个字节。
  4. 打印切片内容。
查看参考答案 (点击揭榜)

fn main() {
    let idiom = String::from("九品芝麻官");
    
    // "九品" 占 6 字节 (3 * 2)
    // 所以从第 6 个字节开始切
    let official = &idiom[6..];
    
    println!("我是: {}", official); // 芝麻官
}
                    

成就解锁:【断章取义】 ✂️