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);
    }
    
    主函数调用函数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()函数声明一个可变整数变量并传递我到一个可变的参考add_one(). add_one() 将变量 i 的值加1。
  • 说明:改变字符串引用

    
    fn main() {
       let mut name:String = String::from("Jc2182");
       display(&mut name); 
       //pass a mutable reference of 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"); 
       //Modify the actual string,name
    }
    
    main()函数传递变量的可变引用namedisplay()函数。display 函数将附加字符串附加到原始name变量。

    输出

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