Rust - 借用

将变量的所有者传递给另一个函数然后返回所有者是非常不方便的。 Rust 支持一个概念,即借用,即值的所有者暂时转移到实体,然后返回到原始所有者实体。

考虑以下因素 −

fn main(){
   // a list of nos
   let v = vec![10,20,30];
   print_vector(v);
   println!("{}",v[0]); // this line gives error
}
fn print_vector(x:Vec<i32>){
   println!("Inside print_vector function {:?}",x);
}

main 函数调用函数 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(){
   // a list of nos
   let v = vec![10,20,30];
   print_vector(&v); // passing reference
   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("TutorialsPoint");
   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"); 
   //修改实际的字符串,name
}

main() 函数将变量name 的可变引用传递给display() 函数。 显示函数将附加字符串附加到原始 name 变量。

输出

param_name value is :TutorialsPoint
The value of name after modification is:TutorialsPoint Rocks