Slice 类型
slice 允许你引用集合中一段连续的元素序列, 而不用引用整个集合, slice 是一种引用, 所以它没有所有权
字符串类型的 slice
rust
fn main() {
let string = String::from("hello world");
let str = &string[6..11]; // 表示 6-11
// 这个语法中的开始和结尾是可以省略的
let str1 = &string[...5]; // 表示 0-5
let str2 = &string[6...]; // 表示 6 到最后
let str3 = &stirng[..]; // 表示最前到最后
println!("str: {str}");
println!("str1: {str1}");
println!("str2: {str2}");
println!("str3: {str3}");
}字符串字面值就是 slice
rust
fn main() {
// 注意这俩的区别
let str: &str = "hello";
let string: String = String::from("world");
println!("str: {str}");
println!("string: {string}");
}slice 作为函数参数和返回值
rust
fn first_world(str: &str) -> &str {
// 将字符串/切片转字符数组 ['h', 'e', 'l', 'l', 'o']
let bytes = str.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &str[0..i];
}
}
// &str[..] 可能会有警告, 所以建议修改为这样
&str[0..bytes.len()]
}
fn main() {
let str = String::from("hello world");
// &str 是 &String, 但是可以看做 &str[..]
// 这样就可以同时兼容 &String 和 &str 类型
let sub_str = first_world(&str);
println!("sub_str: {sub_str}");
}数组类型的 slice
rust
fn main() {
let arr: [i8; 5] = [1, 2, 3, 4, 5];
let sub_arr = &arr[0..3];
let mut i = 0;
while i < sub_arr.len() {
println!("i={}", sub_arr[i]);
i += 1;
}
}Vec 类型的 slice
rust
fn main() {
let mut vec = vec![1, 2, 3];
vec.push(4);
vec.push(5);
let sub_vec = &vec[0..3];
for i in sub_vec.iter() {
println!("i={}", i);
}
}