Rust 变量、所有权与借用
目录
这是 Rust 的灵魂章节。它用一套编译期规则,让你不用垃圾回收也能保证内存安全。
所有权三规则
- 每个值都有一个「所有者」(owner)变量。
- 同一时刻只能有一个所有者。
- 所有者离开作用域,值被自动释放。
移动(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. 基础类型与模式匹配