Z
ZHANK
所有权与借用

引用与借用

&T 不可变引用、&mut T 可变引用、借用规则(一写或多读)

引用与借用

传所有权太麻烦?借用(Borrowing)让你用 & 借来用、不拿所有权。规则:同一时刻,要么一个可变引用,要么多个不可变引用。

学完本章你将: 掌握 &T 不可变引用、&mut T 可变引用、借用规则。


不可变引用 &

rust
fn main() {
    let s = String::from("hello");

    let len = calculate_length(&s);  // 借给函数——不转移所有权

    println!("'{}' 的长度是 {}", s, len);  // ✅ s 仍可用
}

fn calculate_length(s: &String) -> usize {
    s.len()
}  // s 是引用——离开作用域不 drop 数据

可变引用 &mut

rust
fn main() {
    let mut s = String::from("hello");

    change(&mut s);  // 可变借用

    println!("{}", s);  // "hello, world!"
}

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

借用规则(核心!)

rust
let mut s = String::from("hello");

let r1 = &s;    // ✅ 不可变借用
let r2 = &s;    // ✅ 可以有多个不可变借用
// let r3 = &mut s;  // ❌ 不能同时有可变和不可变借用

println!("{} {} {}", r1, r2, s);

// 规则 1:同一时刻,要么一个可变引用,要么多个不可变引用
// 规则 2:引用必须总是有效的(不能悬垂)
// 规则 3:引用的作用域从声明到最后一次使用

💡 这些规则在编译期检查——不是运行时!零性能开销的内存安全。