概述
在rust中切片是一种引用类型,它使我们以引用的方式访问连续内存的数据。
本文介绍切片的定义、使用方法和相关特性。
slice定义
切片是对数据区域的引用,它由如下两个部分组成
- pointer: 指向数据的起始地址;
- length:包含的数据长度;
实例1
fn main() {
let c = String::from("helloworld");
let p1 = &c[0..5];
let p2 = &c[5..10];
println!("{}={}+{}", c, p1, p2);
}
输出结果:
helloworld=hello+world
x…y 表示 [x, y) 的数学含义。… 两边可以没有运算数:
..y 等价于 0..y
x.. 等价于位置 x 到数据结束
.. 等价于位置 0 到结束
实例2
创建了一个数组data,然后使用索引范围1…3创建了一个Sliceslice。这个Slice包含了数组data中索引1和索引2的两个元素。
fn main()
{
let data = [1, 2, 3, 4, 5];
let slice = &data[1..3];
println!("Slice: {:?}", slice);
}
输出结果:
Slice: [2, 3]
实例3
通过指针和长度来手动创建Slice
fn main() {
let data = [1, 2, 3, 4, 5];
let ptr = &data[1] as *const i32;
let len = 3;
let slice = unsafe {
std::slice::from_raw_parts(ptr, len)
};
println!("Slice: {:?}", slice);
}
输出结果:
Slice: [2, 3]
slice特性
- 不可变和可变:Slice可以是不可变的(&[T])或可变的(&mut [T]),取决于它们所引用的数据的可变性。
- slice长度:通过.len()方法获取。
- slice迭代:通过.iter()方法进行迭代。