目录

  1. 什么是 Rust 切片
  2. 为什么要使用切片
  3. 切片的定义与语法
  4. 切片的操作
  5. 切片与所有权
  6. 代码示例
  7. 参考资料与出站链接

什么是 Rust 切片

Rust 切片 (Slice) 是一种引用类型,表示对连续内存序列(如数组、向量或字符串)的部分视图。它不拥有数据,而是借用底层数据,提供灵活的访问方式。切片的类型通常是 &[T](不可变切片)或 &mut [T](可变切片)。


为什么要使用切片

  • 灵活性:访问数据的一部分而无需复制。
  • 内存安全:通过借用规则避免越界或数据竞争。
  • 性能:避免不必要的数据克隆。
  • 通用性:适用于多种集合类型(如 VecString)。

切片的定义与语法

  • 语法&data[start..end]
  • start:起始索引(包含)。
  • end:结束索引(不包含)。
  • 省略
  • &data[..end]:从开头到 end
  • &data[start..]:从 start 到结尾。
  • &data[..]:整个序列。
  • 类型
  • &[T]:不可变切片。
  • &mut [T]:可变切片。
let arr = [1, 2, 3, 4, 5];
let slice = &arr[1..4];  // [2, 3, 4]

切片的操作

  • 访问元素:通过索引 [i]
  • 长度len() 方法。
  • 迭代:使用 for 或迭代器方法。
  • 转换:可转为 Vec(需分配内存)。
let slice = &[1, 2, 3];
println!("Length: {}", slice.len());

切片与所有权

  • 切片是引用,不拥有数据。
  • 受借用规则约束:
  • 不可变切片允许多个借用。
  • 可变切片只能有一个借用。
  • 生命周期与底层数据绑定。

代码示例

基本切片

fn main() {
    let arr = [10, 20, 30, 40, 50];
    let slice = &arr[1..4];
    println!("Slice: {:?}", slice);
}

运行结果:

Slice: [20, 30, 40]

字符串切片

fn main() {
    let s = String::from("Hello, Rust!");
    let hello = &s[0..5];
    let rust = &s[7..11];
    println!("Hello: {}, Rust: {}", hello, rust);
}

运行结果:

Hello: Hello, Rust: Rust

可变切片

fn main() {
    let mut numbers = [1, 2, 3, 4, 5];
    let slice = &mut numbers[1..4];
    slice[0] = 20;  // 修改切片中的值
    println!("Modified array: {:?}", numbers);
}

运行结果:

Modified array: [1, 20, 3, 4, 5]

切片与迭代

fn main() {
    let v = vec![1, 2, 3, 4];
    let slice = &v[0..3];
    for &item in slice {
        println!("Item: {}", item);
    }
}

运行结果:

Item: 1
Item: 2
Item: 3

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 社区支持