Rust切片

77 阅读2分钟

1.什么是切片

Rust的另外一种不持有所有权的数据类型:切片(slice)

还有一种就是前面所说的引用

2.字符串切片

字符串切片是指向字符串中一部分内容的引用

形式: 引用[开始索引..结束索引]

开始索引是切片起始位置的索引值

结束索引是切片终止位置的下一个索引值

fn main() {
    let s = String::from("hello_world");
    let hello = &s[0..5];
    let world = &s[6..11];
    println!("{} {}",hello,world);
}

如果涉及到字符串起始位置,那么起始位置可以省略

fn main() {
    let s = String::from("hello_world");
    let hello = &s[..5];
    let world = &s[6..];
    let hello_world = &s[..];
    println!("{} {}",hello,world);
}
  • 字符串切片的范围索引必须发生在有效的UTF-8字符边界内
  • 如果尝试从一个多字节的字符创建字符串切片,程序会报错退出

3.字符串字面值是切片

字符串字面值被直接存储在二进制程序中

let s = "hello,world";

变量s的类型是&str,他是一个指向二进制程序特定位置的切片,&str是不可变引用,所以字符串字面值也是不可变的。

4.将字符串切片作为参数传递

fn first_world(s:&String) -> &str {}

有经验的rust开发者会采用&str作为参数类型,因为这样就可以同时接收String和&str类型的参数了

fn first_world(s:&str) -> &str {}

  • 如果使用字符串切片作为参数,那么就直接调用该函数
  • 如果使用String作为参数,那么可以创建一个完整的String切片来调用该函数

定义函数时使用字符串切片来代替字符串引用会使我们的API更加通用,且不会损失任何功能。