0Pricing
Learn Rust Coding · 课时

字符串与 &str

拥有所有权的文本与借用的文本

字符串与 &str 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

两种字符串类型

Rust 有两种主要的文本类型:

  • String — 拥有所有权且可增长的字符串。
  • &str — 借用的字符串切片,是文本的一种视图。
fn main() {
    let owned: String = String::from("hello");
    let borrowed: &str = "world";
    println!("{} {}", owned, borrowed);
}

字符串字面量是 &str

使用双引号编写文本时,得到的是 &str。它是固定的,并存储在程序的二进制文件中。

fn main() {
    let greeting = "Hi there"; // type is &str
    println!("{}", greeting);
}

创建 String

使用 String::from 或 .to_string() 方法创建拥有所有权的 String。

fn main() {
    let a = String::from("abc");
    let b = "xyz".to_string();
    println!("{} {}", a, b);
}

增长字符串

由于 String 拥有所有权且可以增长,因此您可以使用 push_str 和 push 向其中追加内容。

fn main() {
    let mut s = String::from("Hello");
    s.push_str(", ");
    s.push_str("Rust");
    s.push('!');
    println!("{}", s);
}

字符串拼接

使用 + 运算符或 format! 宏连接字符串。format! 不会消耗其输入。

fn main() {
    let first = String::from("Hello");
    let second = String::from("World");
    let joined = format!("{} {}", first, second);
    println!("{}", joined);
}

将 String 借用为 &str

String 可以自动借用为 &str。这样,函数就可以接受任意一种类型。

fn print_text(text: &str) {
    println!("text: {}", text);
}

fn main() {
    let owned = String::from("owned");
    print_text(&owned);
    print_text("literal");
}

为什么优先使用 &str 参数

函数通常接受 &str 而不是 String。这样更加灵活:调用者可以传入拥有所有权的字符串、字面量或切片。

fn shout(s: &str) -> String {
    s.to_uppercase()
}

fn main() {
    println!("{}", shout("quiet"));
}

以字节为单位的长度

len() 方法返回的是字节长度,而不是字符数。ASCII 文本中的每个字符占用一个字节。

fn main() {
    let s = "hello";
    println!("{} bytes", s.len());
}

检查内容

有用的读取方法包括 contains、starts_with 和 is_empty。

fn main() {
    let s = "hello world";
    println!("{}", s.contains("world"));
    println!("{}", s.starts_with("hello"));
}

所有权差异

String 在堆上拥有自己的数据,并负责释放这些数据。&str 只是借用现有数据,不拥有任何内容。

fn main() {
    let owned = String::from("data");
    let view: &str = &owned[0..2];
    println!("owned {} view {}", owned, view);
}

在两者之间转换

可以相互转换:

  • &str 转为 String:使用 .to_string() 或 String::from。
  • String 转为 &str:使用 &s 或 s.as_str()。
fn main() {
    let s = String::from("convert");
    let slice: &str = s.as_str();
    let back: String = slice.to_string();
    println!("{} {}", slice, back);
}

快速检查

回顾这两种文本类型之间的区别。

总结

Rust 中的字符串:

  • String — 拥有所有权、可增长且分配在堆上的字符串。
  • &str — 借用的切片或视图,也是字符串字面量的类型。
  • 使用 String::from 或 to_string() 创建;使用 push_str 增长。
  • 函数参数优先使用 &str。
fn main() {
    let mut msg = String::from("Rust");
    msg.push_str(" rocks");
    let view: &str = &msg;
    println!("{} ({} bytes)", view, view.len());
}

常见问题解答

「字符串与 &str」课时是免费的吗?

是的 — 「字符串与 &str」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「字符串与 &str」这节课中我会学到什么?

拥有所有权的文本与借用的文本 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「字符串与 &str」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 向量
  2. 字符串与 &str
  3. HashMaps
  4. 遍历集合
← 返回 Learn Rust Coding