Rust借用
将变量的所有权传递给另一个函数然后返回所有权是非常不便的。 Rust支持借用的概念,在该概念中,值的所有权临时转移到实体,然后又返回到原始所有者实体。
考虑以下:
fn main(){ //数字向量 let v = vec![10,20,30]; print_vector(v); println!("{}",v[0]); //此行给出错误 } fn print_vector(x:Vec<i32>){ println!("Inside print_vector function {:?}",x); }
main函数调用print_vector函数,向量v将作为参数传递给此函数,向量的所有权也从函数main传递给print_vector函数。
上面的代码将导致错误,如下所示,main()函数尝试访问向量 v 。
| print_vector(v); | - value moved here | println!("{}",v[0]); | ^ value used here after move
这是因为一旦所有权转移到另一个函数后,最初拥有该变量或值的函数将不能再使用该变量或值。
什么是借用?
当一个函数暂时将对变量/值的控制权转移给另一个函数时,这称为借用,这是通过将引用传给变量来实现的(&var_name),而不是将变量/值本身传递给函数。
在被调函数执行完成后,将变量/值的所有权转移回变量的原始所有者。
fn main(){ //数字向量 let v = vec![10,20,30]; print_vector(&v); //传递引用 println!("Printing the value from main() v[0]={}",v[0]); } fn print_vector(x:&Vec<i32>){ println!("Inside print_vector function {:?}",x); }
Inside print_vector function [10, 20, 30] Printing the value from main() v[0] = 10
可变引用
函数可以使用 可变引用 这样的资源,可变引用的前缀是&mut,可变引用只能对可变变量进行操作。
例子:可变整数引用
fn add_one(e: &mut i32) { *e+= 1; } fn main() { let mut i = 3; add_one(&mut i); println!("{}", i); }
main() 函数声明一个可变的整数变量 i 并将i的可变引用传递给add_one()函数,add_one()函数将变量i的值加1。
例子:可变字符串引用
fn main() { let mut name:String = String::from("newbiego"); display(&mut name); //传递name的可变引用 println!("The value of name after modification is:{}",name); } fn display(param_name:&mut String){ println!("param_name value is :{}",param_name); param_name.push_str(" Rocks"); //修改实际的字符串,name }
main() 函数传递变量name的可变引用给display()函数,display()函数将额外的字符串附加到原始字符串name之后。
param_name value is :newbiego The value of name after modification is:newbiego Rocks