Rust语言学习

Rust Slices

2020-03-21  本文已影响0人  kaiv2

Slices 类型

另一个没有所有权的类型是slicesslices允许你引用集合里中的一段元素,而不是引用整个集合。

字符串 slice

字符串 sliceString中一部分值的引用。 看起来像这样:

let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6...11];

这类似引用整个String,不过只是&s[0..5]的部分。它不是对整个String的引用,而是对部分String的引用,strar..end的语法 代表一个以start开头连续但不包括endrange。如果需要包含end,可以使用..=,而不是..

let s = String::from("hello world");
let hello = &s[0..=4];
let world = &s[6..=10];

Rustrange语法:

let s = String::from("hello world");
let h = &s[..5]; // 等价于 &s[0..5];
let len = s.len();
let w = &s[6..]; // 等价于 &s[6..len]
let hw = &s[..];// 等价于 &s[0..len]

字符串字面值就是 slice

let s = "hello world";

这里的 s 的类型是 &str:它指向二进制程序特定位置的slice。这也就是为什么字符串字面值是不可变的;&str是一个不可变引用。

字符串 slice 作为参数

fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (idx, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[..idx];
        }
    }
    &s[..]
}

fn main() {
    let s = String::from("hello world");
    let hello = first_word(&s[..]);
}

其他类型的 slice

let a = [1, 2, 3, 4, 5];
let slice = &a[1..3];

这 slice 的类型是&[i32]。它跟字符串 slice 的工作方式一样,通过存储一个集合元素的引用和一个集合总长度。你可以对其他所有集合使用这类 slice。

总结

所有权、借用和 slice 这些概念让 Rust程序在编译时确保内存安全。Rust语言提供了更其他系统编程语言相同的方式来控制你使用内存的,但拥有数据所有者在离开作用域之后自动清除其数据的功能,意味着你无需额外编写和调试相关的控制代码。

上一篇下一篇

猜你喜欢

热点阅读