String vs str

我们现在可以理解 Rust 中的两种字符串类型:

fn main() {
    let s1: &str = "World";
    println!("s1: {s1}");

    let mut s2: String = String::from("Hello ");
    println!("s2: {s2}");
    s2.push_str(s1);
    println!("s2: {s2}");
    
    let s3: &str = &s2[6..];
    println!("s3: {s3}");
}

Rust 术语:

  • &str 一个字符串切片的不可变引用。
  • String 一个可变的字符串缓冲区。
  • &str 表示一个字符串切片,它是一个指向存在内存块中的 UTF-8 编码的字符串数据的不可变引用。字符串字面量 (如 ”Hello”),都保存在程序的二进制文件内。

  • Rust 的 String 类型是一个 bytes 类型 vector 的封装。和 Vec<T> 一样,它是有所有权的。

  • 与许多其它类型一样,String::from() 从字符串字面量创建一个字符串;String::new() 创建一个字符串,它可以使用 push()push_str() 方法添加字符串数据。

  • format!() 宏是一种从不定值创建自有所有权的字符串的方便方法。它接受与 println!() 相同的格式化字符串。

  • 你可以通过 & 和随意的范围选择从 String 借用出一个 &str 切片。

  • 对于 C++ 程序员:把 &str 想象为 C++ 中的 const char*,但是它总是指向内存中的有效字符。Rust 的 String 可以粗略看作 C++ 中的std::string (主要区别:它只能包含 UTF-8 编码的字节,并且不会使用 small-string 优化)。