小编典典

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

all

为什么 Rust 有Stringand strString
和有什么区别str?什么时候使用String而不是str反之亦然?其中之一是否已被弃用?


阅读 143

收藏
2022-03-03

共1个答案

小编典典

String是动态堆字符串类型,例如Vec:当您需要拥有或修改您的字符串数据时使用它。

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

  • 在静态存储 中:字符串文字"foo"&'static str. 数据被硬编码到可执行文件中,并在程序运行时加载到内存中。

  • 在已分配的堆内String:取消对 的数据视图String引用&strString

  • 在堆栈上 :例如,以下创建一个堆栈分配的字节数组,然后将该数据的视图作为&str

    use std::str;
    

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

总之,String如果您需要拥有的字符串数据(例如将字符串传递给其他线程,或在运行时构建它们),请使用,&str如果您只需要字符串的视图,请使用。

这与 vectorVec<T>和 slice之间的关系相同&[T],并且类似于一般类型的按值T和按引用之间的关系。&T


1A为str定长;您不能写入超出结尾的字节,或留下尾随无效字节。由于 UTF-8 是一种可变宽度编码,因此str在许多情况下,这有效地强制所有 s
不可变。一般来说,突变需要比以前写入更多或更少的字节(例如,用(2+字节)替换a(1字节)将需要在
中腾出更多空间str)。有一些特定的方法可以&mut str就地修改 a,主要是那些只处理 ASCII
字符的方法,比如make_ascii_uppercase.

2自 Rust 1.2 以来,
动态大小的类型允许Rc<str>使用一系列引用计数的 UTF-8 字节。Rust 1.21 允许轻松创建这些类型。

2022-03-03