01. 所有权系统
Rust 的所有权系统是其内存安全的核心机制,无需垃圾回收即可保证内存安全。
所有权规则:
- 每个值都有一个所有者(owner)
- 同一时刻只能有一个所有者
- 当所有者离开作用域时,值被自动释放
移动(Move):将值从一个变量赋给另一个变量时,所有权转移,原变量不再可用。
克隆(Clone):使用 .clone() 方法可以深拷贝数据,两个变量都拥有独立的数据。
rust
fn main() {
// 所有权转移
let s1 = String::from("hello");
let s2 = s1; // s1 的所有权移动到 s2
// println!("{}", s1); // 编译错误!s1 已失效
println!("{}", s2); // 正常
// 克隆
let s3 = String::from("world");
let s4 = s3.clone(); // 深拷贝
println!("s3 = {}, s4 = {}", s3, s4); // 两个都有效
// 函数也会转移所有权
let s5 = String::from("rust");
let s6 = takes_ownership(s5);
// s5 已失效
println!("s6 = {}", s6);
}
fn takes_ownership(s: String) -> String {
println!("获得了: {}", s);
s // 返回所有权
}02. 借用与引用
借用(Borrowing)允许你使用值但不获取所有权。通过引用(&)来借用。
借用规则:
- 可以有任意多个不可变引用(&T)
- 或者只能有一个可变引用(&mut T)
- 不能同时存在可变引用和不可变引用
这些规则在编译时检查,确保数据竞争不会发生。
rust
fn main() {
let mut s = String::from("hello");
// 不可变借用
let r1 = &s;
let r2 = &s;
println!("r1 = {}, r2 = {}", r1, r2);
// r1 和 r2 在此之后不再使用
// 可变借用
let r3 = &mut s;
r3.push_str(", world");
println!("r3 = {}", r3);
}
// 计算字符串长度,借用但不获取所有权
fn calculate_length(s: &String) -> usize {
s.len()
}
// 修改借用的值
fn add_world(s: &mut String) {
s.push_str(", world");
}Rust 的所有权系统在编译时检查内存安全,零运行时开销。
知识测验
第 1/5 题正确 0
Rust 所有权规则是什么?
下一节
下一节 结构体与枚举