gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:31:04 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

  • 堆里面分配String : String dereferences to a &str viewString的数据。

  • 在堆栈上:例如下面创建一个堆栈分配的字节数组,然后得到一个 view of that data as a &str :

    use std::str;

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

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

这与向量 Vec<T> 之间的关系相同和一片 &[T] ,类似于按值T之间的关系并引用 &T对于一般类型。


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

2 Dynamically sized types允许像 Rc<str> 这样的事情对于自 Rust 1.2 以来的引用计数 UTF-8 字节序列。 Rust 1.21 允许轻松创建这些类型。

关于string - Rust 的 `String` 和 `str` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57759187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com