在 Rust 中,切片(slice)是一种对数组或字符串的一部分进行引用的数据结构。切片本身并不拥有数据,而是借用数据的一部分,因此它是不可变的(immutable)或可变的(mutable)引用。
切片在 Rust 中非常常用,因为它们提供了对数组或字符串子序列的高效访问方式,同时避免了不必要的复制。
Rust 中的切片有两种主要类型:
数组切片:用于引用数组的一部分。
字符串切片:用于引用字符串的一部分(在 Rust 中,字符串被存储为 &str 类型,它本质上是一个字节切片)。
你可以通过指定数组的起始和结束索引来创建一个切片。例如:
fn main() {
let arr = [1, 2, 3, 4, 5];
let slice = &arr[1..4];
// 创建一个包含 [2, 3, 4] 的切片
slice.iter().for_each(|x| println!("{}", x));
}
字符串切片在 Rust 中非常常见,因为字符串字面量本身就是 &str 类型:
fn main() {
let content: &str = "Hello World!";
let content_slice = &content[1..5];
println!("{}",content_slice);
}
虽然切片可以引用数组或字符串的一部分,但一旦创建,其长度是固定的。你不能改变切片的长度,但你可以修改切片中的元素(如果切片是可变的)。
切片是对数据的借用,因此它们遵循 Rust 的借用规则。你不能在借用(切片)存在的同时修改被借用的数据(除非切片本身就是可变的)。
由于切片不拥有数据,它们不会造成内存泄漏或悬挂指针(dangling pointer)。当原始数据被销毁时,所有指向它的切片都会自动失效。