さび-借りる

変数の所有権を別の関数に渡してから所有権を返すのは非常に不便です。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()を呼び出します。ベクトルは、パラメーターとしてこの関数に渡されます。ベクターの所有権もに渡され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);
}

メイン()関数は、変更可能な整数変数宣言の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
}

メイン()関数は、変数の変更可能な参照渡し表示()関数。表示関数は、元の名前変数に追加の文字列を追加します。

出力

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