Rust 笔记 I

Rust 的字符串本质上是 u8 序列,但是很多时候从 u8 序列转换回字符串是有风险的,毕竟并不是所有的 u8 序列都是有效的 字符串。
所以原则上来说,能直接使用 char 对字符串处理是最好的。

字符串与Chars

通过 str.chars() 可以获得一个 Chars 结构,他的定义如下

1
2
3
pub struct Chars<'a> {
iter: slice::Iter<'a, u8>,
}

但它是一个迭代器,字符串处理中经常需要随机访问,Chars.nth(mut n: usize) 可以获取到第 N 个字符(其实这是一个 Iterator trait 的方法),但是代价是这是一个 O(n) 的操作。通过空间换时间,可以这么做

1
let chars = s.chars().collect::<Vec<_>>();

不过当大部分操作都是顺序操作的时候,用迭代器才是最优解。

substring

我找了一圈,没找到这个在其他语言中司空见惯的方法,不过想来 Java 中 substring 是一份复制,Rust 中对于复制总是谨慎的。
并且由于对于一个 String/str 任意位置的做切片是一件很危险的事情,因为他不能保证切片位置不是一个 Unicode 字符中间,所以最佳的方案,依旧是——处理一个 Vec<char>