引用与借用
&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:引用的作用域从声明到最后一次使用
💡 这些规则在编译期检查——不是运行时!零性能开销的内存安全。