切片

切片给你一个大集合的一个视图:

fn main() {
    let a: [i32; 6] = [10, 20, 30, 40, 50, 60];
    println!("a: {a:?}");

    let s: &[i32] = &a[2..4];
    println!("s: {s:?}");
}
  • 切片从原类型中借用数据。
  • 问题:如果你修改 a[3] 会发生什么?
  • 我们通过借用 a 并在括号中指定起始和结束的索引来创建切片。

  • 如果切片由索引0开始,Rust 的 range 语法允许我们不写起始索引,也就是说 &a[0..a.len()]&a[..a.len()] 是完全一致的。

  • 对于结束索引也一样,所以 &a[2..a.len()]&a[2..] 是一样的。

  • 为了方便地创建完整数组的切片,我们可以使用 &a[..]

  • s 是一个 i32 类型切片的引用。注意 s 的类型(&[i32])不再提及数组的长度。这允许我们在不同长度的切片上执行计算。

  • 切片总是从别的对象借用而来。在这个例子中,a 必须保持 ‘存活’(在作用域)到至少要与我们的切片一样久。

  • 关于修改 a[3] 的问题能引发一个有趣的讨论,而答案是,处于内存安全考虑,当你创建一个切片后,你不能通过 a 进行修改,但是 as 都可以让你安全地读取数据。更多细节会在借用检查器章节说明。