Rust中字符串String与str比较


String是一种可增长的、堆分配的数据结构,允许您存储 UTF-8 字符序列。这与 Python 的类型类似str,但有一个关键区别 - StringRust 是可变的并且可以修改(Rust Doc: String)。

另一方面,str(发音为“字符串切片”)是字符串的不可变引用或“视图”。它可以指向整个字符串或它的一部分(Rust Doc:str)。
您最常遇到的str是其借用形式,表示为&str。

为什么 Rust 有两种字符串类型?
Rust 中的两种字符串类型满足不同的用例。

  • String当您需要拥有一个字符串并更改其内容时使用,例如附加字符或更改某个位置的字符。
  • str用于更多“只读”操作。由于它是不可变的引用,因此它不拥有底层内存,也无法更改它。

让我们看一个例子:

fn main() {
    let mut s = String::from("hello");
    s.push_str(
", world");  // This works fine
    println!(
"{}", s);
}

在这个 Rust 程序中,我们创建一个String,然后使用push_str方法附加到它,Python 开发人员可能会惊讶地发现,因为 Python 中的字符串是不可变的。

现在,让我们看看当我们尝试修改:

fn main() {
    let mut s = "hello";
    s[0] = 'H';  
// This will cause an error
    println!(
"{}", s);
}

我们尝试将strs 的第一个字符替换为“H”。如果s是一个可变的String,我们可以用replace_range方法来做到这一点。

但因为s是 一个str,我们无法更改其内容,并且该程序将无法编译,因为它str是不可变的。

我们是否尝试附加到字符串或更改特定字符并不重要 - str这两者都不允许。
如果我们想将一个字符附加到字符串中,我们首先必须将其转换为带有s.to_string(). 然后,我们可以使用push方法将一个字符附加到String.

fn main() {
    let s = "hello";
    let mut t = s.to_string();  
// Convert to String to allow changes
    t.push('!');  
// Append a character to the string
    println!(
"{}", t);
}

String和str服务于不同的目的。String当您需要拥有和修改字符串数据时使用,str当您需要字符串的临时只读视图时使用。

Rust 字符串类型使您可以更好地控制内存分配,并有助于防止与内存访问相关的错误。这种设计选择符合 Rust 的性能和安全性核心目标。