Rust 所有权 (Ownership)
1. 所有权
Rust 使用“所有权 (ownership)”来以一种安全的方式管理内存。
在 Rust 中,每个值都有一个所有者 (owner)。所有者通常是一个变量。
2. 所有权规则
- 每一个值都有一个所有者。
- 当所有者超出作用域时,该值将被删除。
- 在同一时间,一个值只能有一个所有者,除非您借用(borrow)它(我们将在下一章讨论借用)。
3. 基本的所有权示例
在这个例子中,a 拥有该字符串。然后我们将其移动 (move) 给 b:
示例
let a = String::from("Hello");
let b = a;
// println!("{}", a); 错误:a 不再拥有该值
println!("{}", b); // 成功:b 现在拥有该值当我们将 a 赋值给 b 时,所有权发生了转移(移动)。这意味着现在只有 b 可以使用该值,因为 a 已经失效了。
但是,像数字、字符和布尔值等简单数据类型是被复制 (copied),而不是被移动的。
这意味着在将其赋值给另一个变量后,您仍然可以使用原始变量:
示例
let a = 5;
let b = a;
println!("a = {}", a); // 可以正常运行
println!("b = {}", b); // 可以正常运行在这里,a 被复制到了 b 中,而不是被移动,因此您依然可以使用 a 和 b。
4. 克隆 (Clone)
对于像 String 这样的其他类型,如果您真的想保留原始值并同时将其赋值给另一个变量,您可以使用 .clone() 方法,它会创建数据的一个深层副本:
示例
let a = String::from("Hello");
let b = a.clone(); // 现在两者拥有相同的值
println!("a = {}", a); // 可以正常运行
println!("b = {}", b); // 可以正常运行然而,如果您不需要拥有该值两次,使用引用(&,借用)通常比克隆要好得多。您将在下一章中了解更多关于引用的知识。
5. 为什么所有权如此重要?
- Rust 使用所有权机制在内存不再被需要时自动释放内存。
- 它能防止发生错误,比如使用已经被删除的内存(悬垂指针等)。
- 这是 Rust 语言既极其安全又保持高速的原因之一。