切片

切片是 Rust 中提供的一种不持有所有权的数据类型,它是对某些类型(String,Array...)特定地位的援用。

  • 在 Rust 中,字符串的字面值就是切片类型,是对二进制程序特定地位值的一个援用,并且是不可变援用
  • 切片类型的符号应用 &str 示意

接下来咱们看一下如何创立一个切片

// 1.应用字面值创立切片let slice = "haha";// 2.应用 range 对 String 进行切片let s = String::from("hello world");let sclice_s = &s[0..5]; // "hello"// 如果是从结尾到结尾进行切片,则能够简写let sclice_s_all = &s[..]; // "hello world"

为什么要应用切片

对于初学的同学可能会有这样一个疑难,为什么要应用切片,应用切片是为了解决什么问题?要搞明确这些问题,咱们首先应该理解一些利用场景,能力有助于后续的剖析。假如当初咱们要设计这样一个函数,其性能是提取一个字符串中首个空格前的所有字符,没有空格则返回整个字符串,如("hello world" 提取出 "hello"),但当初咱们不能应用切片,只能思考获取要害地位的索引

  • 从一个字符串中匹配第一个呈现的空格,并返回其索引
  • 如果没有匹配到空格,则返回字符串的长度

接下来咱们看 Rust 的实现

fn main() {    let str = String::from("hello world");    let index = get_space_index(&str);    println!("index is {}", index); // index is 5}fn get_space_index(s: &String) -> usize {    // 将字符串转为字符数组    let arr = s.as_bytes();    for (i, &item) in arr.iter().enumerate() {        if item == b' ' {            return i;        }    }    s.len()}

下面的例子能够实现获取首个空格的索引,后续咱们也能够通过这个索引来实现需求,但这种形式的问题是,咱们获取的索引和字符串不是强关联的,如果咱们在应用索引之前,意外的对指标字符串进行了批改,那么这个索引也就失去它的意义了。

基于以上的问题,咱们应该应用切片来建设与指标字符串的强关联,并且利用切片是不可变援用的个性,让 Rust 编译器来帮咱们查看 通过可变援用批改指标字符串值 的不合理操作 (对于这里有疑难的同学能够看我的上一篇分享 -《03-援用与借用》)

接下来咱们应用切片来实现最后的需要

fn main() {    let str = String::from("hello world");    let first_word = slice_first_word(&str[..]);    println!("{}", first_word); // hello}fn slice_first_word(s: &str) -> &str {    // 将字符串转为字符数组    let arr = s.as_bytes();    for (i, &item) in arr.iter().enumerate() {        // 判断以后位是否是空格        if item == b' ' {            return &s[..i];        }    }    &s[..]}

其余数据类型的切片

数组

let arr = [1,2,3,4,5];let slice = &arr[1..3];println!("{:?}", slice); // [2,3]