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