目录

Rust 变量、所有权与借用

这是 Rust 的灵魂章节。它用一套编译期规则,让你不用垃圾回收也能保证内存安全

所有权三规则

  1. 每个值都有一个「所有者」(owner)变量。
  2. 同一时刻只能有一个所有者。
  3. 所有者离开作用域,值被自动释放。

移动(Move)

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;          // 所有权从 s1 移到 s2
    // println!("{}", s1); // ❌ 编译报错:s1 已失效
    println!("{}", s2);   // ✅
}

String 这类堆上数据,赋值不是拷贝,而是转移所有权。这避免了「两个变量都去释放同一块内存」的灾难。

借用(Borrow)

想用值又不想转移所有权?用引用 &

fn main() {
    let s = String::from("hello");
    let len = calc_len(&s);   // 借给函数用,不转移
    println!("'{}' 长度是 {}", s, len); // s 依然可用
}

fn calc_len(s: &String) -> usize {
    s.len()
} // 这里只释放引用,s 本身不受影响

可变借用

fn main() {
    let mut s = String::from("hi");
    change(&mut s);
    println!("{}", s); // "hi, rust"
}

fn change(s: &mut String) {
    s.push_str(", rust");
}

规则:同一作用域内,可变引用最多一个,且不能与不可变引用共存——从编译期杜绝数据竞争。

小结

  • 默认不可变:let x = 5;,要改加 mut
  • 想读用 &,想改加 &mut
  • 所有权 + 借用让 Rust 在编译期就消灭了一大类内存 bug。

➡️ 3. 基础类型与模式匹配