Rust-borrowing

提供:Dev Guides
移動先:案内検索

錆-借りる

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

可変参照

関数は、そのようなリソースへの_mutable reference_を使用して、借りたリソースを変更できます。 可変参照には、 &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の値を1増やします。

図:文字列参照の変更

fn main() {
   let mut name:String = String::from("finddevguides");
   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()_関数は、変数_name_の可変参照を_display()_関数に渡します。 表示関数は、元の_name_変数に追加の文字列を追加します。

出力

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