Rust-切片

切片(Slice)

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

  • 一道题,编写一个函数:

    • 它接收字符串作为参数
    • 返回它在这个字符串的第一个空格的索引
    • 如果函数没有找到任何空格,那么返回整个字符串的长度
    fn main(){
        let s = String::from("see you");
        println!("{}",first_word(&s));
    }
    fn first_word(s:&String) -> usize{
        let my_bytes = s.as_bytes();
        for (i, &item) in my_bytes.iter().enumerate() {
            if item == b' '{
                return i;
            }
        }
        s.len()
    }
    

    字符串切片

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

      方括号中的两个索引值为左闭右包

    语法糖

使用

改写最开始的函数,让它返回一个字符串切片:

fn main(){
    let s = String::from("see you");
    println!("{}",first_word(&s));
}
fn first_word(s:&str) -> &str{
    let my_bytes = s.as_bytes();
    for (i, &item) in my_bytes.iter().enumerate() {
        if item == b' '{
            return &s[..i];
        }
    }
    &s[..]
}

  • 其实,字符串字面值就是字符串切片

  • Rust中切片的其他性质:

    //以下代码会报错
    fn main(){
        let mut s = String::from("see you");
        let s0 = first_word(&s);
        s.clear(); 
        println!("{}",s0);
    }
    fn first_word(s:&str) -> &str{
        let my_bytes = s.as_bytes();
        for (i, &item) in my_bytes.iter().enumerate() {
            if item == b' '{
                return &s[..i];
            }
        }
        &s[..]
    }
    

其他

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

  • 其他数据类型的切片:

    fn main(){
        let arr = [1,2,3,4,5];
        let arr0 = &arr[1..3];
        for elem in arr0 {
            println!("{}",elem);
        }
    }
    

毛小川's Blog

环游是无趣~


2022-05-31