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
。 数据被硬编码到可执行文件中,并在程序运行时加载到内存中。 - 在分配的堆内部
String
:String
对String
数据的&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";