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); 
   //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() 函式將變數 name 的可變引用傳遞給 display() 函式。display 函式將額外的字串追加到原始 name 變數。

輸出

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