0Pricing
Learn Rust Coding · 课时

切片

借用的视图

切片 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

什么是切片

切片是集合中连续部分的借用视图。它不拥有数据 — 而是指向已有数据。

切片使用方括号中的范围表示。

fn main() {
    let arr = [1, 2, 3, 4, 5];
    let part = &arr[1..4];
    println!("{:?}", part);
}

切片范围语法

范围用于选择起始索引和结束索引。结束位置是排他的。

  • &v[1..4] — 索引 1、2、3。
  • &v[..3] — 从开头到 3。
  • &v[2..] — 从 2 到末尾。
fn main() {
    let v = vec![10, 20, 30, 40];
    println!("{:?}", &v[..2]);
    println!("{:?}", &v[2..]);
}

字符串切片

字符串切片 &str 是 String 一部分的视图。索引范围以字节位置为单位。

fn main() {
    let s = String::from("hello world");
    let hello = &s[0..5];
    let world = &s[6..11];
    println!("{} {}", hello, world);
}

整个集合的切片

使用 &v[..] 获取整个集合的切片。这就是 Vec 借用为切片的方式。

fn main() {
    let v = vec![1, 2, 3];
    let whole = &v[..];
    println!("{:?}", whole);
}

将切片作为参数

接受 &[T] 的函数既可以接受数组,也可以接受向量,因此更加灵活。

fn sum(items: &[i32]) -> i32 {
    let mut total = 0;
    for x in items {
        total += x;
    }
    total
}

fn main() {
    let v = vec![1, 2, 3];
    let a = [4, 5, 6];
    println!("{} {}", sum(&v), sum(&a));
}

切片只借用,不拥有

由于切片是借用的,使用切片期间,原集合必须保持有效。编译器会强制执行这一点。

fn main() {
    let v = vec![100, 200, 300];
    let s = &v[0..2];
    println!("slice {:?}, original {:?}", s, v);
}

切片长度

与其他集合一样,切片也有一个 len() 方法,用于返回其覆盖的元素数量。

fn main() {
    let v = vec![5, 6, 7, 8, 9];
    let middle = &v[1..4];
    println!("length {}", middle.len());
}

first 和 last

切片提供 first() 和 last(),它们返回 Option,因此可以安全处理空切片。

fn main() {
    let data = [10, 20, 30];
    let s = &data[..];
    println!("{:?} {:?}", s.first(), s.last());
}

迭代切片

您可以像迭代其他集合一样迭代切片。

fn main() {
    let v = vec![1, 2, 3, 4];
    for x in &v[1..3] {
        println!("{}", x);
    }
}

一个获取首词的函数

切片的常见用途是返回已有文本中的一段切片,例如句子的第一个词。

fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (i, &b) in bytes.iter().enumerate() {
        if b == b' ' {
            return &s[0..i];
        }
    }
    s
}

fn main() {
    println!("{}", first_word("hello there"));
}

切片为何安全

切片可以避免复制数据,同时防止悬空引用。借用检查器保证底层数据的生命周期长于切片。

fn main() {
    let words = vec!["a", "b", "c", "d"];
    let pair = &words[1..3];
    println!("{:?}", pair);
}

快速检查

回顾切片表示什么。

总结

Rust 中的切片:

  • 借用视图:&v[start..end],结束位置排他。
  • &str 是字符串切片;&[T] 是数组或向量切片。
  • 切片参数既接受数组,也接受向量。
  • 借用检查器确保切片的安全。
fn average(nums: &[i32]) -> i32 {
    nums.iter().sum::<i32>() / nums.len() as i32
}

fn main() {
    let v = vec![4, 8, 12];
    println!("{}", average(&v[..]));
}

常见问题解答

「切片」课时是免费的吗?

是的 — 「切片」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「切片」这节课中我会学到什么?

借用的视图 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「切片」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. String 与 &str 的区别
  2. 切片
  3. 字符串方法
  4. UTF-8 与字符
← 返回 Learn Rust Coding