切片和数组
在前面的代码中, 我们使用到了 String 类型和 &str 类型。
可既然有 &str 那为什么要使用 String 呢?
这是因为在 Rust 中, String 类型的字符串, 是一个动态长度的字符串, 可以在任意位置增加或减少字符。
而 &str 类型的字符串, 是一个静态长度的字符串, 它的长度在编译时就确定了, 不能改变。
&str 适用于只读借用, 而 String 适用于修改操作。
切片
切片允许引用集合中的部分连续元素, 而不是整个集合。&str 类型就是一个字符串切片。
切片的语法是 &[start..end]。其中 start 是切片的起始位置, end 是切片的结束位置。
需要注意的是, 切片的范围是左闭右开区间, 即包含 start 位置, 不包含 end 位置。
例如: let s = "hello world";, s 就是一个字符串切片, 它的类型是 &str。
&s[0..5] 表示获取字符串 s 的前 5 个字符, 即 "hello"。
边界是可以省略的, 从零开始可以写为: &s[..5], 到结尾可以写为: &s[6..]。
Rust 字符串是 UTF-8 编码, 切片时需要保证切在合法字符边界, 否则会导致程序崩溃。
切片是相当常用的功能, 避免了复制从而提供效率, 也可以提供灵活视图操作。
数组
Rust 中的数组也是编译时固定长度, 要求所有元素类型相同, 性能较高, 使用 let var: [type; length] = []; 定义。
例如: let arr: [i32; 5] = [1, 2, 3, 4, 5];, 声明了一个长度 5 的 i32 类型数组。
如果需要使用动态的数组, Rust 提供了 Vec<T> 动态数组, 它的长度可以在运行时改变。常用于不定量数据, 例如用户输入, 命令行参数等。
前面我们使用的 Vec<String> 就是这样的元素类型为 String 的动态数组。