30 天拿下 Rust 之切片
![30天拿下Rust之切片](https://static001.geekbang.org/infoq/76/76824dec8992f0e3909e559c7e631157.jpeg)
💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。
概述
在 Rust 中,切片是一种非常重要的引用类型。它允许你安全地引用一段连续内存中的数据,而不需要拥有这些数据的所有权。切片不包含分配的内存空间,它仅仅是一个指向数据开始位置和长度的数据结构。切片是对数组的一个连续引用,它提供了一种方便、高效的方式来操作数组的一部分。切片本身并不拥有数据,它只是原始数组的一个视图,因此创建切片通常是一个低开销的操作。
切片的声明
在 Rust 中,切片的声明格式如下。
下面,我们详细介绍切片声明中的各个元素。
slice_name:切片变量取的名字。
[T; n]:是一个泛型,表示一个包含 n 个类型为 T 的元素的切片。但在实际声明中,通常不需要指定 n,因为 Rust 会根据初始化的数据自动推断出长度。
&array[start..end]:创建一个从 array 中的 start 索引到 end 索引(但不包含 end 索引)的切片。start 和 end 是范围操作符..的参数,用于定义切片的开始位置和结束位置(但不包括结束位置)。注意:start 索引可以不写,不写时默认为 0;end 索引也可以不写,不写时默认为 array 的最后一个元素的索引。
在下面的示例代码中,我们使用数组的切片操作创建了 slice 切片,Rust 会自动推断出 slice 切片的类型为:&[i32]。
如果我们要声明一个可变切片,可以使用 mut 关键字。在下面的示例代码中,&mut 表示对原始数组的一个可变引用,这意味着你可以通过这个切片修改原始数组的内容。
如果我们要声明一个空的切片,可以使用空数组字面量来初始化。在下面的示例代码中,empty_slice 是一个空的 i32 类型切片。注意:我们在这里显式指定了切片的类型,因为空切片本身不包含足够的信息来自动推断类型。
切片的使用
1、获取切片的长度,可以使用 len()方法。
2、切片可以通过索引来访问其内部元素。切片的索引遵循与数组相同的规则:从 0 开始,并且是基于半开区间[start, end)的原则,即:包含起始索引,但不包含结束索引。
注意:索引操作不会进行越界检查,如果尝试访问超出切片范围的索引,将导致运行时错误。为了安全地访问切片元素,可以使用 get()方法。
3、切片可以通过迭代器来进行遍历。我们可以使用 for 循环配合.iter()方法来迭代不可变切片中的元素,或者使用.iter_mut()方法来迭代可变切片中的元素。
4、字符串切片(&str)可以通过 chars()方法来迭代其中的 Unicode 字符。这是因为:Rust 中的字符串是 UTF-8 编码的,而一个 Unicode 字符可能由 1 到 4 个字节组成。chars()方法会返回一个实现了 Iterator trait 的结构体,每次迭代都会返回一个 char 类型的值。
另外,字符串切片还包括非常多实用的方法。
is_empty():检查字符串切片是否为空。
bytes():返回一个迭代器,可以遍历字符串字节。
starts_with(&prefix)、ends_with(&suffix):检查字符串切片是否以指定前缀或后缀开始/结束。
find(subslice):查找子字符串,并返回其索引(如果存在);否则,返回 None。
contains(char) 、contains(&str):检查字符串切片中是否存在指定字符或子字符串。
split(char)、split_whitespace():根据指定分隔符创建迭代器,每次迭代返回一个新字符串切片。
trim()、trim_start()、trim_end():移除字符串切片开头、结尾处的空白字符。
to_lowercase()、to_uppercase():转换为小写或大写字母形式。
这些方法具体如何使用,可参考下面的示例代码。
总结
最后,我们来总结一下切片的特性,主要有以下几点。
1、引用类型:切片是一种引用类型,它允许我们以引用的方式访问连续内存的数据。
2、没有所有权:切片本身并不拥有数据,而是对数据的一种引用或视图。这意味着切片不会复制数据,而是直接引用原始数据,没有拷贝数据的额外开销。
3、连续内存:切片引用的是一段连续的内存分配,而不是整个集合。这使得切片能够安全、高效地访问数组,而无需复制数据。
4、可变与不可变:切片可以是可变的,也可以是不可变的,这取决于它们所引用的数据的可变性。可变切片允许修改引用的数据,而不可变切片则不允许。
5、索引与迭代:切片可以使用数字索引来访问其中的元素,索引从 0 开始计数。此外,切片还支持迭代,可以使用迭代器来遍历切片中的元素。
版权声明: 本文为 InfoQ 作者【希望睿智】的原创文章。
原文链接:【http://xie.infoq.cn/article/1a4af722a480b653f6e4fc6a2】。文章转载请联系作者。
评论