目录
什么是 Rust 切片
Rust 切片 (Slice) 是一种引用类型,表示对连续内存序列(如数组、向量或字符串)的部分视图。它不拥有数据,而是借用底层数据,提供灵活的访问方式。切片的类型通常是 &[T]
(不可变切片)或 &mut [T]
(可变切片)。
为什么要使用切片
- 灵活性:访问数据的一部分而无需复制。
- 内存安全:通过借用规则避免越界或数据竞争。
- 性能:避免不必要的数据克隆。
- 通用性:适用于多种集合类型(如
Vec
、String
)。
切片的定义与语法
- 语法:
&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
参考资料与出站链接
- 官方文档:
- 学习资源:
- 社区支持:
发表回复