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