Rust 切片初始化
切片(slice)是对连续内存区域的引用,不拥有数据。以下是各种创建切片的方法:
从数组创建切片
// 从数组创建切片
let arr = [1, 2, 3, 4, 5];
let slice1 = &arr; // 整个数组的切片
let slice2 = &arr[1..4]; // [2, 3, 4]
let slice3 = &arr[..3]; // [1, 2, 3] 从开头到索引3
let slice4 = &arr[2..]; // [3, 4, 5] 从索引2到结尾
let slice5 = &arr[..]; // [1, 2, 3, 4, 5] 整个数组
从 Vec 创建切片
let vec = vec![10, 20, 30, 40, 50];
let slice6 = &vec[1..4]; // [20, 30, 40]
let slice7 = &vec; // 整个 Vec 的切片
let slice8 = vec.as_slice(); // 显式转换为切片
字符串切片
let s = String::from("hello world");
let slice9 = &s[0..5]; // "hello"
let slice10 = &s[6..]; // "world"
// 字符串字面量本身就是切片
let slice11: &str = "hello"; // &str 是字符串切片类型
可变切片
let mut arr = [1, 2, 3, 4, 5];
let slice12 = &mut arr[1..4]; // 可变切片
slice12[0] = 100; // 修改切片内容
let mut vec = vec![1, 2, 3, 4];
let slice13 = &mut vec[..]; // 整个 Vec 的可变切片
使用切片方法
let data = [1, 2, 3, 4, 5, 6];
// split_at 方法
let (left, right) = data.split_at(3); // ([1,2,3], [4,5,6])
// chunks 方法
let slice14 = &data;
for chunk in slice14.chunks(2) {
println!("{:?}", chunk); // [1,2], [3,4], [5,6]
}
// windows 方法
for window in slice14.windows(3) {
println!("{:?}", window); // [1,2,3], [2,3,4], [3,4,5], [4,5,6]
}
从其他类型创建
// 从 Box<[T]> 创建
let boxed: Box<[i32]> = vec![1, 2, 3].into_boxed_slice();
let slice15 = &*boxed;
// 空切片
let empty_slice: &[i32] = &[];
let empty_from_array = &[][..];
函数参数中的切片
// 函数接受切片参数
fn process_slice(data: &[i32]) {
println!("处理 {} 个元素", data.len());
}
// 使用
let arr = [1, 2, 3];
let vec = vec![4, 5, 6];
process_slice(&arr); // 传入数组切片
process_slice(&vec); // 传入 Vec 切片
process_slice(&vec[1..3]); // 传入部分切片
重要特点
- 切片是借用,不拥有数据
- 包含指针和长度信息
-
&[T]
是不可变切片,&mut [T]
是可变切片 - 切片边界必须在有效范围内,否则运行时panic