Rust 入门 切片

切片(slice)

  • 切片允许你引用集合中一段连续的元素序列,而不用引用整个集合。
  • 切片没有所有权

习题

  • 编写一个函数,该函数接收一个字符串,并返回在该字符串中找到的第一个单词。如果函数在该字符串中并未找到空格,则整个字符串就是一个单词,所以应该返回整个字符串。

尝试解答

fn main() {
    let mut str = String::from("Hello world");
    let word = first_word(&str);
    println!("{}", word);
}

// 传递一个字符串的引用, 返回第一个单词的结束位置
// 我们不应该取得该字符串的所有权, 所以参数表中使用借用
fn first_word(s: &String) -> usize {
    let bytes = s.as_bytes();
    for (i, &byte) in bytes.iter().enumerate() {
        if byte == b' ' {
            return i;
        }
    }
    return s.len();
}

显然这是不符合题意的

正确解答

fn main() {
    let str = String::from("Hello world");
    let word = first_word(&str);
    println!("{}", word);
}

fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();
    for (i, &byte) in bytes.iter().enumerate() {
        if byte == b' ' {
            return &s[..i];
        }
    }
    return &s[..];
}
  • &str 是一个字符串切片
  • 字符串切片允许引用字符串中的一部分
  • 字符串切片的语法和Python类似
  • 通过 [a..b]来创建一个字符串切片, a 表示 切片开始位置, b 表示切片结束位置
  • 如果切片位置从头开始, 那么切片开启位置就是 0, 可以忽略不写
  • 如果切片位置一直到结尾, 那么切片结束位置就是 s.len(), 可以忽略不写

字符串字面值

  • 字符串字面值是直接存储在二进制程序中的
  • 字符串字面值就是指向程序特定位置的字符串切片
  • 字符串切片是不可变的引用, 所以字符串字面值不可变

其他类型的切片

  • 字符串切片正如你想象的那样: 是针对字符串的
  • 不过也有更通用的切片类型
fn main() {
    let a = [1, 2, 3, 4, 5];
    let slice = &a[1..3];
}
  • 上面这个例子中的切片类型是&[i32]

总结

  • 所有权、借用和切片这些概念让 Rust 程序在编译时确保内存安全。

  • Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存, 但数据持有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码

如果对我分享的内容感兴趣的话  记得关注我得动态
求推荐  求收藏  求转发  求关注
posted @ 2021-06-21 20:36  Delayer  阅读(278)  评论(0)    收藏  举报