跟着谷歌安卓团队学Rust-切片的作用

146 阅读3分钟

大家好,我是梦兽编程。欢迎回来与梦兽编程一起刷Rust的系列。

这是由 Google 的 Android开发团队的分享Rust课程。本课程涵盖了 Rust 的方方面面,从基本语法到泛型和错误处理等高级主题。

该课程的最新版本可以在 google.github.io/comprehensi…找到。如果您正在其他地方阅读,请检查那里的更新。

如果你喜欢看梦兽编程的版本可以订阅跟着谷歌安卓团队学Rust订阅最新内容,梦兽编程也期待大家关注我的个人网站。

加入梦兽编程微信群juejin.cn/user/206673…

切片

Rust 中的切片(slice)是一种引用数据类型,它指向一个连续的元素序列。切片可以用来表示数组、字符串、列表等数据结构的一部分。

切片的作用主要有以下几点:

  1. 方便地操作数据结构的一部分。
  2. 提高代码的可读性和可维护性。
  3. 减少内存的占用。
fn main() {
    let mut a: [i32; 6] = [10, 20, 30, 40, 50, 60];
    println!("a: {a:?}");

    let s: &[i32] = &a[2..4];

    println!("s: {s:?}");
}

以上案例代码中这个数组的元素比较少,你会感觉不出有什么切片的特点。

但是正式的场景处理的数据往往很庞大。我们在调试的过程数组数据进行断点调试的时候看到的数据内容都会让开发者头皮发麻。

我们会想能不能取出数组中的某一段数据引用进行操作既提高了阅读性也提高了维护性。

取出数组某一段引用的这个过程,在rust、golang中都叫切片。

取出切片的方式也相当简单使用&的"引用标记符号"和取出的长度即可获取切片引用。

let s = &a[startIdx..endIdx]

获取切片的简写

如果你想获取数组的整个长度的切片你可以这么写,但是一般不会有人这么做,为什么不直接操作数组呢?

&a[..a.len()]
// 相当于从0到数组的长度都获取了

如果你想从第二位获取到数组的末尾

&a[2..]
// 和 &a[2..a.len()] 是没有任何区别

为了轻松地创建完整数组的切片,我们可以使用&a[..]。

注意事项

由于切片是引用数组的某一段数据块,我们使用切片的时候需要注意“原对象”必须保持“存活”,至少要和切片 “活的” 一样久。

Question

问:如果在打印a[3]之前修改s会发生什么? 如果你能回答这个问题那已经理解引用的关系了。

fn main() {
    let mut a: [i32; 6] = [10, 20, 30, 40, 50, 60];
    println!("a: {a:?}");

    // let s: &[i32] = &a[2..4];
	// 注意我们这里需要修改成可怕引用
	let s = &mut a[2..4]
	s[1] = 100;
    println!("s: {s:?}");
	println!("a[3]:{a[3]}")
}

// output
// a[3]: 100

我们在修改数组的元素就不需要操作数组这么大的内存变量,只需要操作切片某一小段的数据块就好了。

总而言之,Rust 中的切片是一种非常方便和灵活的数据类型,它可以用来操作数据结构的一部分。

rexweb.link/category/te…或者更多技术可以收藏梦兽编程rexweb.link

  1. 梦兽编程倔强号
  2. 梦兽编程知乎
  3. 梦兽编程bilibili

微信搜索梦兽编程公众号

##梦兽编程倔强号 juejin.cn/user/206673…

##梦兽编程知乎 www.zhihu.com/people/mo-d…

##梦兽编程bilibili space.bilibili.com/106325238?s…