Rust 专门提出了所有权和转移的概念,第一次接触总感觉晦涩,不属于正常思维,但还是得耐下性子,观摩观摩 Rust 所谓的转移。
Rust 中,对大多数类型而言,给变量赋值、给函数传值或者从函数返回值,这些操作不会发生值复制,而是“转移”。所谓转移,就是原来的所有者让渡这个值的所有权给目标所有者,并变成未初始化状态。然后,由目标所有者控制这个值的生命期。
上面这段话是我抄的,绕来绕去的,我们结合简单的例子,通过 Rust 编译器的输出来认识 “move” 动作:
fn main() {
let orders = vec!["183".to_string(), "136".to_string()];
let tmp_a = orders;
let tmp_b = orders;
}
上述的代码会编译报错,当然,重点不是报错:unused variable,重点是下面的截图。Vec 没有实现 Copy 特性,赋值 orders 的时候值发生了转移,赋值 tmp_a 的时候又发生了转移,赋值 tmp_b 的时候就报错了。如果在 Go 语言中,这样的赋值是完全没有问题的。
因为在给 tmp_a 赋值之后,orders 变成了未初始化的状态。未初始化的状态表示没有任何值,没有在堆或者栈上申请任何空间。类比 Go 语言的话,空的指针类型声明就属于位初始化的状态。例子中, orders 在第一次赋值完成之后,变成未初始化的状态,相当于清空了为 orders 分配的内存,后续的程序再也无法使用 orders。这样的处理方式,对我们编程真的有帮助吗?