切片
切片给你一个大集合的一个视图:
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
进行修改,但是a
和s
都可以让你安全地读取数据。更多细节会在借用检查器章节说明。