Rust - Ödünç Alma

Bir değişkenin sahipliğini başka bir işleve aktarmak ve ardından sahipliği iade etmek çok sakıncalıdır. Rust, bir değerin mülkiyetinin geçici olarak bir işletmeye devredildiği ve ardından asıl sahip varlığa iade edildiği bir kavramı, ödünç almayı destekler.

Aşağıdakileri düşünün -

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

Ana işlev bir print_vector () işlevi çağırır . Bu işleve parametre olarak bir vektör aktarılır. Vektörün sahipliği de geçirilir print_vector () gelen fonksiyonu , ana () . Yukarıdaki kod, main () işlevi v vektörüne erişmeye çalıştığında aşağıda gösterildiği gibi bir hatayla sonuçlanacaktır .

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

Bunun nedeni, sahiplik başka bir işleve aktarıldıktan sonra, bir değişkenin veya değerin, kendisine ait olan işlev tarafından artık kullanılamamasıdır.

Borçlanma nedir?

Bir fonksiyon bir değişken / değer üzerindeki kontrolünü bir süreliğine başka bir fonksiyona geçici olarak aktardığında buna ödünç alma denir. Bu, değişkene bir referans iletilerek elde edilir(& var_name)değişkenin / değerin kendisini işleve geçirmek yerine. Değişkenin / değerin sahipliği, denetimin geçirildiği işlevin yürütülmesini tamamladıktan sonra değişkenin orijinal sahibine aktarılır.

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

Çıktı

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

Değişken Referanslar

Bir işlev, ödünç alınmış bir kaynağı , bu tür bir kaynağa değiştirilebilir bir referans kullanarak değiştirebilir . Değiştirilebilir bir referansın başında&mut. Değişken referanslar yalnızca değiştirilebilir değişkenler üzerinde çalışabilir.

Örnek: Bir tam sayı referansını değiştirme

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

Ana () işlevi, bir değişken tamsayıdır değişken bildirir ı ve i kesilebilir bir referans iletiradd_one(). Add_one (), i değişkeninin değerini birer birer artırır.

Örnek: Bir dize referansını değiştirme

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
}

Ana () işlevi, değişken bir değişken referans geçen adı için ekran () işlev. Görüntüleme işlevi, orijinal ad değişkenine ek bir dize ekler .

Çıktı

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