Rust Slices
2020-03-21 本文已影响0人
kaiv2
Slices 类型
另一个没有所有权的类型是slices
,slices
允许你引用集合里中的一段元素,而不是引用整个集合。
字符串 slice
字符串 slice
是 String
中一部分值的引用。 看起来像这样:
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
开头连续但不包括end
的 range
。如果需要包含end
,可以使用..=
,而不是..
。
let s = String::from("hello world");
let hello = &s[0..=4];
let world = &s[6..=10];
Rust
的range
语法:
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
语言提供了更其他系统编程语言相同的方式来控制你使用内存的,但拥有数据所有者在离开作用域之后自动清除其数据的功能,意味着你无需额外编写和调试相关的控制代码。