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 的引用,如下图:

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

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}");
}