免费的建筑设计网站,爱民网站制作,招商网站建设推广,网站开发的需求文档在Rust中#xff0c; 字符串类型其实是一个比较复杂的话题。在Rust的标准库中#xff0c;至少都提供了6种字符串类型#xff0c;我们平常使用的最多的是其中的两种。这两种类型互相之间也有所关联#xff1a;
str#xff1a; 字符串切片String 字符串 其中#xff0c; 字…在Rust中 字符串类型其实是一个比较复杂的话题。在Rust的标准库中至少都提供了6种字符串类型我们平常使用的最多的是其中的两种。这两种类型互相之间也有所关联
str 字符串切片String 字符串 其中 字符串切片的常见形式是它的借用类型str, 通常一些字符串字面量都属于str类型 例如:
let msg Hello ; // msg的类型是str字符串切片通常也被直接称为字符串 很多人会把它跟另一种字符串类型String混淆。他们之间的主要区别在于
str: 是一个借用不能被修改String: 可以被修改
我们常用两个函数将字符串切片转换成字符串
let msg ab.to_string(); // 调用字符串切片的to_string()函数
let msg String::from(ab); // 将字符串切片作为参数传给String类型的from函数从数据结构的角度来看 str类型由一个指向一组字节的指针和长度(len)属性组成
String类型由一个指向一组字节的指针 长度(len)属性和容量(capacity)属性组成 因此可以看出str其实可以看作是String的一部分。 因此 它们也具有很多其他相同的特征 例如根据定义、编译器强制要求以及运行时检查这两种字符串类型都是有效的 UTF-8格式。 另外 不论是str还是String, 都不能用下标来访问对应位置的字符因为英文并不是这个世界上唯一的语言 随便google一下就可以得知这个世界上至少有6900多种不同的语言文字和甚至还有各种不同的表情图案 要把这么多种文字都能通过编码的形式表达 只有Unicode编码可以做到 因此 字符串都是Unicode编码的 这就是为什么字符串中的字符不能用下标来访问的原因例如
let word สวัสดี;如果我们想要通过下标来访问最后一个符号可能会想到这样做
word[3] // ดี但这不能得到我们想要的结果实际上上面的字符串会被存储在一个18字节的可变数组(vector)中, 如下
224184170224184177224184177224184170224184148224184181
上面的word[3]实际上得到的就是上面这个数组中的第4个元素224, UTF-8的编码规则下 一个Unicode字符可能占用1 - 4个字节的长度不定因此必须要遍历每个字节才知道每个符号从哪里开始在哪里结束。在上面的例子中每3个字节代表了一个Unicode符号(scalars) 而其中可能由一个或多个Unicode符号才能组成一个有意义的文字符号graphemes Rust的标准库的集合类型提供的索引操作始终保证是时间恒定的操作 但是对于字符串的索引却不能做到因为当我们对字符串进行索引操作时得到的是字节而这个结果大概率并不是我们想要得到的结果如上所述一个有意义的语言文字字符可能是一个或多个字节组成的。
所以当我们看到一个字符串时我们可以选择进行下面的操作
word.bytes(); : 用bytes()函数来获取字符串的UTF-8字节的向量(Vector), 如果你能保证使用的文字只有ASCII码中包含的部分的话 用索引来获取字符串中的字符也没有问题word.chars(): 用chars()函数可以获得一个迭代器可以返回字符串中的每个Unicode标量 再用例如unicode-segmentation这样的包中提供的函数来得到有意义的文字符号 。
如果选择使用迭代器来处理字符串的话 迭代器提供了一个函数nth() 可以用来替代索引 例如
word.chars().nth(3) // 获取word中的第4个Unicode标量Rust的字符串类型提供了许多现成的函数用于处理字符串下面是列出的一些