切片
借用的视图
切片 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。
什么是切片
切片是集合中连续部分的借用视图。它不拥有数据 — 而是指向已有数据。
切片使用方括号中的范围表示。
fn main() {
let arr = [1, 2, 3, 4, 5];
let part = &arr[1..4];
println!("{:?}", part);
}切片范围语法
范围用于选择起始索引和结束索引。结束位置是排他的。
&v[1..4]— 索引 1、2、3。&v[..3]— 从开头到 3。&v[2..]— 从 2 到末尾。
fn main() {
let v = vec![10, 20, 30, 40];
println!("{:?}", &v[..2]);
println!("{:?}", &v[2..]);
}字符串切片
字符串切片 &str 是 String 一部分的视图。索引范围以字节位置为单位。
fn main() {
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
println!("{} {}", hello, world);
}整个集合的切片
使用 &v[..] 获取整个集合的切片。这就是 Vec 借用为切片的方式。
fn main() {
let v = vec![1, 2, 3];
let whole = &v[..];
println!("{:?}", whole);
}将切片作为参数
接受 &[T] 的函数既可以接受数组,也可以接受向量,因此更加灵活。
fn sum(items: &[i32]) -> i32 {
let mut total = 0;
for x in items {
total += x;
}
total
}
fn main() {
let v = vec![1, 2, 3];
let a = [4, 5, 6];
println!("{} {}", sum(&v), sum(&a));
}切片只借用,不拥有
由于切片是借用的,使用切片期间,原集合必须保持有效。编译器会强制执行这一点。
fn main() {
let v = vec![100, 200, 300];
let s = &v[0..2];
println!("slice {:?}, original {:?}", s, v);
}切片长度
与其他集合一样,切片也有一个 len() 方法,用于返回其覆盖的元素数量。
fn main() {
let v = vec![5, 6, 7, 8, 9];
let middle = &v[1..4];
println!("length {}", middle.len());
}first 和 last
切片提供 first() 和 last(),它们返回 Option,因此可以安全处理空切片。
fn main() {
let data = [10, 20, 30];
let s = &data[..];
println!("{:?} {:?}", s.first(), s.last());
}迭代切片
您可以像迭代其他集合一样迭代切片。
fn main() {
let v = vec![1, 2, 3, 4];
for x in &v[1..3] {
println!("{}", x);
}
}一个获取首词的函数
切片的常见用途是返回已有文本中的一段切片,例如句子的第一个词。
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &b) in bytes.iter().enumerate() {
if b == b' ' {
return &s[0..i];
}
}
s
}
fn main() {
println!("{}", first_word("hello there"));
}切片为何安全
切片可以避免复制数据,同时防止悬空引用。借用检查器保证底层数据的生命周期长于切片。
fn main() {
let words = vec!["a", "b", "c", "d"];
let pair = &words[1..3];
println!("{:?}", pair);
}快速检查
回顾切片表示什么。
总结
Rust 中的切片:
- 借用视图:
&v[start..end],结束位置排他。 &str是字符串切片;&[T]是数组或向量切片。- 切片参数既接受数组,也接受向量。
- 借用检查器确保切片的安全。
fn average(nums: &[i32]) -> i32 {
nums.iter().sum::<i32>() / nums.len() as i32
}
fn main() {
let v = vec![4, 8, 12];
println!("{}", average(&v[..]));
}常见问题解答
「切片」课时是免费的吗?
是的 — 「切片」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。
「切片」这节课中我会学到什么?
借用的视图 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Learn Rust Coding 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「切片」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Learn Rust Coding 课中编写并运行代码吗?
能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。