Skip to content

08.Slice

切片的用法

观察以下源代码:

rust
let mut s = String::from("hello world");
let hello = &s[0..5]; // 直接指向 s 堆数据的引用
let world = &s[6..11];
let s2 = &s; // 指向 s 的引用
println!("{hello}");
s.push_str(" !");
println!("{s}")

slice 的用法是 start..end ,左闭右开。

在内存中,形如 &s[0..5] 的引用,是直接指向堆上的数据的,而不是栈上的数据,&s 为指向栈上的变量 s 的引用,如下图:

image-20250224105111884

除了上述直接指向堆中数据的特性外,slice 还具有指向数据的长度的特性,即具备指向数据的长度,下图为更详细的内存图,可以看到 slice 还具备了 len 属性:

image-20250224105829335

range

给出切片的范围时,默认左闭右开,如果从头开始切片,则起始的索引 0 可以省略,如 [..5] ;如果切片到末尾,则结束的索引 len 可以省略,如 [2..] ;如果切片全部,则两头的索引都可以省略,如 [..]

字符串

字面值:写在代码里的固定的值,不会因为代码的执行而发生改变。数据是在源代码编译好的可执行文件中的一部分

字符串字面值和切片都是字面值,不会发生改变:

rust
let a = "Hello World!";
let b = &a[0..5];
println!("{a}, {b}");

字面值的类型表示为 &str ,在函数传参等地方使用。

本节全部代码

rust
fn main() {
    let mut s = String::from("hello world");
    let hello = &s[0..5]; // 直接指向 s 堆数据的引用
    let world = &s[6..11];
    let s2 = &s; // 指向 s 的引用
    println!("{hello}");
    s.push_str(" !");
    println!("{s}");

    // 字符串字面值
    let a = "Hello World!";
    let b = &a[0..5];
    println!("{a}, {b}");
}