前言:
每一个程序都会采用一定的方式管理其占用的内存,通过 Rust 写出的程序也不例外。但在 Rust 中,它既不依赖于程序员自由地管理内存,也不依赖于垃圾回收,而是利用新颖的 所有权 来管理着程序拥有的内存。
所有权 是 Rust 的核心功能之一,用耐心与细心去掌握它!
一、所有权
所有权 的规则很简单:
- Rust 中的每一个值都有一个被称为 所有者(owner) 的变量。
- 值有且只有一个所有者。
- 当所有者(变量)离开 作用域(scope) ,这个值将被丢弃。
所有者的概念很好理解,然而 作用域 是什么玩意?
- 一个项(item)在程序中有效的范围我们将其成为该项的作用域。
一般来说来说,大括号:“{}”中间所包括的空间即为其内部项的作用域。
打个比方:
fn main() {
{
let mut number = 0;
}
number = 1;
}
编译下代码:
error[E0425]: cannot find value
number
in this scope
src/main.rs:5:5 | 5 | number = 1; |
^^^^^^ not found in this scope
在当前作用域找不到 number
如果把 let mut number = 1;
的外部的大括号删除:
warning: value assigned to
number
is never read
虽然因为未使用 number 变量编译器进行了警告,但显然我们已经解决了之前的错误。
目前为止,Rust 所有权功能似乎与其他语言的变量管理机制相仿,为了了解所有权机制的不同之处,我们得继续深入了解一番。
先来一段代码:
fn main() {
let number = 0;
let temp = number;
println!("{}",number);
println!("{}",temp);
}
编译正常,输出:
0
0
然而,如果是字符串呢?
fn main() {
let s = String::from("看看帅气能否传递!");
let temp = s;
println!("{}",s);
println!("{}",temp);
}
error[E0382]: borrow of moved value:
s
这又是为什么呢?
要明白这点,就得了解 Rust 的另一个机制:移动(move)。
在其他语言中,一个变量赋值给另一个变量的方式有两种:浅拷贝 与 深拷贝。