乐趣区

关于rust:Rust入门系列之切片

切片

切片 是 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]
退出移动版