← SEARCHABLE ARCHIVE
Rust · 2026-07-23

从 Rust 基础到掌握 — 第 3 集

将所有权、借用和切片与代码连接起来

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

Rust 中的所有权是一条在编译时决定谁清理内存的规则。 在函数类型中指示该值是否将被移动、只读或可变。

移动值

fn print_name(name: String) {
    println!("{name}");
}

let player_name = String::from("Rose");
print_name(player_name);
//此处不能再次使用player_name。

String 拥有堆数据,因此在分配或传递值时所有权会发生变化。 为了保持原件有效,您必须明确复制或引用它。

不可变和可变引用

fn print_name(name: &str) {
    println!("{name}");
}

fn add_suffix(name: &mut String) {
    name.push_str("_01");
}

let mut player_name = String::from("Rose");
print_name(&player_name);
add_suffix(&mut player_name);

简单借用 &str 来读取字符串内容,借用 &mut String 来更改值。 您不能在同一范围内同时使用一个可变引用和另一引用。

此限制可防止读取值时发生更改或同时在两个位置进行修改的情况。

切片

fn first_word(text: &str) -> &str {
    match text.find(' ') {
        Some(index) => &text[..index],
        None => text,
    }
}

切片是对字符串或数组的连续部分的引用,但不拥有它。 不需要整个字符串的函数可以通过接收 &str 来使用字符串文字和字符串切片。

参考的生命周期

编译器确保引用的寿命不会超过原始引用的寿命。 如果您尝试返回对函数外部局部变量的引用,它将无法编译,因为原始变量首先消失。

当遇到所有权错误时,您应该首先确定该值的实际所有者应该是谁,而不是首先克隆它。 借用是一种避免复制的技术,同时也是一种限制打字访问权的合同。