将变量的所有权传递给另一个函数然后返回所有权是非常不便的, Rust支持借位Borrowing的概念,其中值的所有权临时转移到实体,然后又返回到原始所有者实体。
考虑以下内容-
链接:https://www.learnfk.comhttps://www.learnfk.com/rust/rust-borrowing.html
来源:LearnFk无涯教程网
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); }
主函数调用函数 print_vector(),向量将作为参数传递给此函数,向量的所有权也从 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("LearnFKPoint"); display(&mut 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"); //修改实际字符串,名称 }
main()函数将变量 name 的可变引用传递给 display()函数,显示函数将一个附加字符串附加到原始 name 变量中。
param_name value is :LearnFKPoint The value of name after modification is:LearnFKPoint Rocks
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)