Rust - Vay mượn

Rất bất tiện khi chuyển quyền sở hữu của một biến cho một hàm khác và sau đó trả lại quyền sở hữu. Rust hỗ trợ một khái niệm, vay mượn, trong đó quyền sở hữu một giá trị được chuyển tạm thời cho một thực thể và sau đó trả lại cho thực thể chủ sở hữu ban đầu.

Hãy xem xét những điều sau -

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);
}

Hàm main gọi một hàm print_vector () . Một vectơ được chuyển làm tham số cho hàm này. Quyền sở hữu vectơ cũng được chuyển cho hàm print_vector () từ hàm main () . Đoạn mã trên sẽ dẫn đến lỗi như hình dưới đây khi hàm main () cố gắng truy cập vào vector v .

|  print_vector(v);
|     - value moved here
|  println!("{}",v[0]);
|     ^ value used here after move

Điều này là do một biến hoặc giá trị không còn có thể được sử dụng bởi hàm đã sở hữu nó ban đầu khi quyền sở hữu được chuyển sang một hàm khác.

Vay mượn là gì?

Khi một hàm chuyển quyền kiểm soát của nó đối với một biến / giá trị sang một hàm khác tạm thời, trong một thời gian, nó được gọi là mượn. Điều này đạt được bằng cách chuyển một tham chiếu đến biến(& var_name)chứ không phải truyền chính biến / giá trị cho hàm. Quyền sở hữu của biến / giá trị được chuyển cho chủ sở hữu ban đầu của biến sau khi hàm mà điều khiển được chuyển đến hoàn tất quá trình thực thi.

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);
}

Đầu ra

Inside print_vector function [10, 20, 30]
Printing the value from main() v[0] = 10

Tham chiếu có thể thay đổi

Một hàm có thể sửa đổi một tài nguyên đã mượn bằng cách sử dụng một tham chiếu có thể thay đổi đến tài nguyên đó. Tham chiếu có thể thay đổi được bắt đầu bằng&mut. Các tham chiếu có thể thay đổi chỉ có thể hoạt động trên các biến có thể thay đổi.

Minh họa: Thay đổi tham chiếu số nguyên

fn add_one(e: &mut i32) {
   *e+= 1;
}
fn main() {
   let mut i = 3;
   add_one(&mut i);
   println!("{}", i);
}

Hàm main () khai báo một biến số nguyên có thể thay đổi i và chuyển một tham chiếu có thể thay đổi của i đếnadd_one(). Add_one () tăng giá trị của biến i lên một.

Minh họa: Thay đổi tham chiếu chuỗi

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
}

Hàm main () chuyển một tham chiếu có thể thay đổi của tên biến đến hàm display () . Hàm hiển thị thêm một chuỗi bổ sung vào biến tên gốc .

Đầu ra

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