转让所有权
价的所有权可以通过以下方式转移 -
-
将一个变量的值分配给另一个变量。
-
将值传递给函数。
-
从函数返回值。
将一个变量的值赋给另一个变量
Rust 作为一种语言的主要卖点是它的内存安全性。内存安全是通过严格控制谁可以使用什么以及何时使用限制来实现的。
考虑以下片段 -
fn main(){
let v = vec![1,2,3];
// vector v owns the object in heap
//only a single variable owns the heap memory at any given time
let v2 = v;
// here two variables owns heap value,
//two pointers to the same content is not allowed in rust
//Rust is very smart in terms of memory access ,so it detects a race condition
//as two variables point to same heap
println!("{:?}",v);
}
上面的例子声明了一个向量 v。 所有权的想法是只有一个变量绑定到一个资源,要么 v 绑定到资源或 v2绑定到资源。上面的例子抛出一个错误 -使用移动的值:`v`。这是因为资源的所有权已转移到 v2。这意味着所有权从 v 移动到 v2 (v2=v),移动后 v 失效。
将值传递给函数
当我们将堆中的对象传递给闭包或函数时,值的所有权也会发生变化。
fn main(){
let v = vec![1,2,3]; // vector v owns the object in heap
let v2 = v; // moves ownership to v2
display(v2); // v2 is moved to display and v2 is invalidated
println!("In main {:?}",v2); //v2 is No longer usable here
}
fn display(v:Vec<i32>){
println!("inside display {:?}",v);
}
从函数返回值
传递给函数的所有权将在函数执行完成时失效。一种解决方法是让函数将拥有的对象返回给调用者。
fn main(){
let v = vec![1,2,3]; // vector v owns the object in heap
let v2 = v; // moves ownership to v2
let v2_return = display(v2);
println!("In main {:?}",v2_return);
}
fn display(v:Vec<i32>)->Vec<i32> {
// returning same vector
println!("inside display {:?}",v);
}