切片
切片 是 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]