在 Rust 中,切片(slice)
也是一种不持有所有权的数据类型。
切片
字符串切片
字符串切片是指向字符串中一部分内容的引用
&str
表示字符串切片的类型- 形式:
[开始索引..结束索引]
或 [开始索引..=结束索引-1]
开始索引
:切片起始位置的索引,默认为 0,可省略结束索引
:切片终止位置的索引+1,默认为字符串长度,也可省略&s[0..str.len()]
等价于 &s[..]
- 切片的值只有指针和长度组成,没有capacity,因为其与原来的变量共用内存空间
- 说明:
- 字符串切片的索引范围必须发生在有效的 UTF-8 字符边界内
- 多字节的字符中创建字符串切片,程序报错
fn main() {
let s = String::from("Hello world");
let hello = &s[0..5];
let world = &s[6..11];
println!("{}, {}", hello, world);
println!("{}, {}", &s[0..=4], &s[6..=10]);
println!("first word is {}", first_world(&s))
}
fn first_world(s: &String) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[..i];
}
}
&s[..]
}
字符串切片值
字符串切片值(类型为 &str
)被直接存储在二进制程序中:
&str
是不可变引用,所以字符串字面值也是不可变的
fn main() {
let s: &str = "Hello world"; // 变量 s 的类型为 &str,指向二进制程序特定位置的切片
println!("{}", s)
}
字符串切片作为参数
在上面的例子(fn first_world(s: &String) -> &str {
)中,我们使用 &String
接受参数,在 Rust 中推荐使用 &str
作为参数类型,且可以接受 String
和 &str
类型的参数,即:
fn first_world(s: &str) -> &str {
,上面例子中调用时使用 first_world(&s[..])
- 使用字符串切片,直接调用该函数
- 使用
String
,可以创建一个完整的 String 切片来调用该函数
数组切片
以 i32
为例,数组切片的类型为 &[i32]
,组成:
示例:
fn main() {
let arr:[i32; 5] = [1, 2, 3, 4, 5];
let slice: &[i32] = &arr[..2];
println!("{} {}", slice[0], slice[1]);
}