Rust 切片初始化

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容