为什么Rust有String和str?String和str之间有什么区别?什么时候使用String而不是str,反之亦然?其中一个被弃用了吗?


当前回答

str,仅用作&str,是一个字符串片段,是对UTF-8字节数组的引用。

字符串过去是~str,一个可增长的、拥有的UTF-8字节数组。

其他回答

我有C++背景,我发现用C++术语思考String和&str非常有用:

Rust字符串类似于std::String;它拥有内存并执行管理内存的肮脏工作。Rust&str就像char*(但有点复杂);它以同样的方式将我们指向块的开头,您可以获得指向std::string内容的指针。

他们中的任何一个都会消失吗?我不这么认为。它们有两个目的:

字符串保留缓冲区,使用起来非常实用&str是轻量级的,应该用来“查看”字符串。您可以搜索、拆分、解析甚至替换块,而无需分配新的内存。

&str可以查看字符串内部,因为它可以指向某个字符串文本。以下代码需要将文本字符串复制到字符串管理的内存中:

let a: String = "hello rust".into();

以下代码允许您在没有副本的情况下使用文字本身(尽管是只读的):

let a: &str = "hello rust";

对于C#和Java用户:

Rust‘String==StringBuilderRust的&str==(不可变)字符串

我喜欢将&str视为字符串的视图,就像Java/C#中的一个内部字符串,您不能更改它,只能创建一个新字符串。

字符串是一个Object。

&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.廷德尔

简单地说,String是存储在堆上的数据类型(就像Vec一样),您可以访问该位置。

&str是一种切片类型。这意味着它只是对堆中某个已经存在的String的引用。

&str在运行时不进行任何分配。因此,出于内存原因,可以在字符串上使用&str。但是,请记住,在使用&str时,您可能需要处理显式的生存期。