为什么Rust有String和str?String和str之间有什么区别?什么时候使用String而不是str,反之亦然?其中一个被弃用了吗?
当前回答
字符串是一个Object。
&str是对象的一部分的指针。
其他回答
str,仅用作&str,是一个字符串片段,是对UTF-8字节数组的引用。
字符串过去是~str,一个可增长的、拥有的UTF-8字节数组。
对于C#和Java用户:
Rust‘String==StringBuilderRust的&str==(不可变)字符串
我喜欢将&str视为字符串的视图,就像Java/C#中的一个内部字符串,您不能更改它,只能创建一个新字符串。
在Rust中,str是一种表示Unicode标量值序列的原始类型,也称为字符串切片。这意味着它是字符串的只读视图,它不拥有它所指向的内存。另一方面,string是一种可增长的、可变的、拥有的字符串类型。这意味着当您创建字符串时,它将在堆上分配内存以存储字符串的内容,并且当字符串超出范围时,它会释放该内存。因为String是可增长的和可变的,所以您可以在创建String之后更改它的内容。
通常,str在您想要引用存储在另一个数据结构(如string)中的字符串片段时使用。当您想要创建和拥有字符串值时,使用字符串。
这里有一个简单快捷的解释。
字符串-可增长的、可拥有的堆分配数据结构。它可以强制为&str。
str是(现在,随着Rust的发展)可变的固定长度字符串,存在于堆或二进制文件中。只能通过字符串切片视图(如&str)将str作为借用类型进行交互。
使用注意事项:
如果您想拥有或变异字符串,请首选字符串,例如将字符串传递给另一个线程等。
如果希望字符串的只读视图,请首选&str。
在这三种不同类型中let面条=“面条”.to_string();let oodles=面条[1..];让贵宾犬=“ಠ_ಠ“;//这是字符串文本字符串有一个可调整大小的缓冲区,用于保存UTF-8文本。缓冲区是在堆上分配的,因此它可以根据需要调整缓冲区的大小,或者请求。在示例中,“面条”是一个字符串,它拥有八字节缓冲器,其中七个正在使用。你可以想到字符串作为Vec,保证保持格式良好的UTF-8;在里面事实上,这就是String的实现方式。&str是对其他人拥有的UTF-8文本的引用:它“借用”了文本。在示例中,oodles是一个&str参考属于“面条”的文本的最后六个字节,因此它表示文本“oodles”。与其他切片引用一样,&str是一个胖指针,包含实际数据的地址和其长度。你可以把&str看作是&[u8],保证保持格式良好的UTF-8。字符串文字是一个&str,它引用预先分配的文本,通常与程序的机器一起存储在只读存储器中密码在前面的示例中,贵宾犬是一个字符串文本,指向到程序开始执行时创建的七个字节,以及直到它退出。这就是它们在内存中的存储方式
参考资料:Jim Blandy、Jason Orendorff、Leonora F。S.廷德尔
推荐文章
- 如何在Typescript中解析JSON字符串
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- 用javascript检查输入字符串中是否包含数字
- Java:检查enum是否包含给定的字符串?
- 用PHP删除字符串的前4个字符
- 如何从字符串的开始或结束删除所有空白?
- 字符串到JS中的对象
- 为什么Python的原始字符串不能以一个反斜杠结尾?
- 我如何读整个文件到性病::字符串在c++ ?
- 从以特定字符开头的字符串中获取子字符串
- 如何用前导零格式化Java字符串?
- Android Split字符串
- 重复字符串到一定长度
- 我如何应用for-each循环到字符串中的每个字符?