Rust的`String`和`str`有什么区别?

我已经离开了Rust一段时间,并出现了一个新的String 。 这和str什么区别? 什么时候使用String而不是str ,反之亦然? 其中之一是否被弃用?

String是dynamic堆stringtypes,如Vec :当您需要拥有或修改您的string数据时使用它。

str是一个在内存中某个地方的dynamic长度为UTF-8字节的不变的1个序列。 由于大小是未知的,所以只能在指针后面处理它,这意味着str最常见的2显示为&str :对某些UTF-8数据的引用,通常称为“string片”或“片”。 切片只是一些数据的视图,而数据可以在任何地方,例如

  • 在静态存储中:string文字"foo"是一个&'static str 。 数据被硬编码到可执行文件中,并在程序运行时加载到内存中。
  • 在分配的堆内部StringStringString数据的&str视图的解引用 。
  • 在堆栈上:例如下面的代码创build一个堆栈分配的字节数组,然后以一个&str获取这个数据的视图 :

     use std::str; let x: &[u8] = &[b'a', b'b', b'c']; let stack_str: &str = str::from_utf8(x).unwrap(); 

总之,如果您需要拥有string数据(如将string传递给其他任务,或者在运行时构build它们),则使用String如果只需要string视图,则使用&str

这与向量Vec<T>和切片&[T]之间的关系相同,并且类似于一般types的值T和参考值T之间的关系。


1 str是固定长度; 您不能在最后写入字节,或留下无效字节。 由于UTF-8是一个可变宽度编码,这有效地强制所有str不可变。 一般而言,突变需要写入比以前更多或更less的字节(例如,用ä (2+字节)replacea (1字节)将需要在str留出更多空间)。

2目前它只能显示为&str ,但dynamic大小的types可能允许像Rc<str>的一系列引用计数为UTF-8字节。 它也可能不是,因为没有固定大小的版本(尚),所以str完全不适合DSTscheme。

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

String曾经是〜str,一个可增长的,拥有的UTF-8字节数组。

我有一个C ++背景,我发现用C ++来思考String&str非常有用:

  • Rust String就像std::string ; 它拥有内存,并执行内存pipe理的肮脏工作。
  • Rust &str就像一个char* (但更复杂一些); 它指向一个块的开始,就像你可以得到一个指向std::string的内容的指针一样。

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

String保持缓冲区,使用非常实用。 &str是轻量级的,应该用来“查看”string。 您可以search,拆分,parsing甚至replace块,而无需分配新的内存。

&str可以查看一个String内部,因为它可以指向一些string。 以下代码需要将文字string复制到String托pipe内存中:

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

下面的代码可以让你在没有拷贝的情况下使用文字本身(只读)

 let a: &str = "hello rust";