“String”与“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 类型是一个字节 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 optimization))。