สนิม - การยืม

ไม่สะดวกมากที่จะส่งต่อความเป็นเจ้าของตัวแปรไปยังฟังก์ชันอื่นแล้วส่งคืนความเป็นเจ้าของ 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 () เวกเตอร์ถูกส่งเป็นพารามิเตอร์ของฟังก์ชันนี้ กรรมสิทธิ์ของเวกเตอร์ยังถูกส่งไปยังprint_vector ()ฟังก์ชั่นจากmain () รหัสดังกล่าวจะส่งผลให้เกิดข้อผิดพลาดดังต่อไปนี้เมื่อmain ()ฟังก์ชั่นพยายามที่จะเข้าถึงเวกเตอร์โวลต์

|  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 ทีละค่า

ภาพประกอบ: การเปลี่ยนการอ้างอิงสตริง

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 ()ส่งผ่านการอ้างอิงที่ไม่แน่นอนของชื่อตัวแปรไปยังฟังก์ชันdisplay () ฟังก์ชันการแสดงจะต่อท้ายสตริงเพิ่มเติมเข้ากับตัวแปรชื่อเดิม

เอาต์พุต

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