每天学习一点计算机,直到我找到对象 RUST篇 Day3:`String` 和 `&str`,为什么新人总分不清?

用字符串所有权和字符串切片解释 String 与 &str 的分工。

今天记这个

用字符串所有权和字符串切片解释两个常见类型的分工。

先给结论

  • String 拥有字符串内容,可以增长。
  • &str 是字符串片段的引用,不拥有内容。
  • 只读参数通常优先用 &str
  • 很多字符串报错,本质上是所有权和借用没分清。

String 是拥有内容的字符串

String 通常存放在堆上,长度可以变化,它拥有自己的字符串内容。你可以往里面追加字符,也可以把它移动到另一个变量或函数里。只要记住一句话:String 更像一个真正装着文本的容器。

fn main() {
    let mut name = String::from("Rust");
    name.push_str(" learner");
    println!("{name}");
}

&str 是借来看的字符串片段

&str 常被叫做字符串切片,它通常是对某段 UTF-8 文本的引用。它不拥有内容,只是指向一段已经存在的字符串数据。写函数参数时,如果只是读取字符串,优先接收 &str 往往更灵活,因为 String 和字符串字面量都能传进来。

fn greet(name: &str) {
    println!("hello, {name}");
}

fn main() {
    let owned = String::from("Ferris");
    greet(&owned);
    greet("Rust");
}

这里容易混

不要为了传参到处写 .to_string()。如果函数只是读字符串,先考虑把参数设计成 &str

我现在先这样记

  • String 拥有字符串内容,可以增长。
  • &str 是字符串片段的引用,不拥有内容。
  • 只读参数通常优先用 &str
  • 很多字符串报错,本质上是所有权和借用没分清。

这篇先记到这里。下一篇继续看:Rust 的控制流,为什么说它更像“表达式”?。

评论