字符串表示形式和切割¶
一、概述¶
如果按索引语法访问String的某个部分,会报错,如下示例代码
Rust的字符串不支持索引语法访问
二、String类型的内部表示¶
string是Vec<u8>
的包装。Rust有三种看待字符串的方式,分别是:字节(Bytes)、Scalar Values(Unicode标量值)、Grapheme Cluster(字形簇)。
Rust不允许对String进行索引的最后一个原因:索引操作应消耗一个常量时间 O(1),而String无法保证该时间,因为rust需要遍历所有内容,来确定有多少个合法的字符。
三、切割string¶
可以使用[]
和一个范围来创建字符串的切片,如下示例代码
我们切割了6个字节,此时输出的中文字符串是小明
,代表一个中文字符占用了3个字节。在字符串切割时,必须谨慎,比如某种语言的每个字符占用2个字节,那切割的位置索引必须整除2。如果我们切割的位置不在字符的边界,程序运行时将会产生panic
。也就是说我们在切割字符串的时候,必须验证字符的边界来切割。
四、遍历字符串的方法¶
4.1 获得字节¶
可以使用bytes()
方法将字符串按单个字节的方式进行拆分。如下示例代码
4.2 获得标量值¶
可以使用chars()
方法将字符串按单个标量值的方式进行拆分。如下示例代码
4.3 获取字形簇¶
对于字形簇,很复杂,标准库未提供相关接口,如果想快速获取字符串的字形簇,我们可以通过调用三方crate来实现