2016-12-01 8 views
0

錆可変値

let y = &mut 5; 
*y += 1; 
let x = *y + 1; 

let mut y = 5; 
y += 1; 
let x = y + 1; 

の違いは何彼らはprintln!を経由して同じ結果を返すが、私は好適である1を決めることはできません。

答えて

4

変数を一方または他方にバインドし、ローカルにprintln!を呼び出すという単純な例を考えてみると、実際には結果に大きな違いはありません。

変更可能な値と変更可能な参照は、関数境界を越えるとより明確になります。このコードを見てください:

fn main() { 
    let mut x = &mut 5; 

    do_work(x); 

    println!("{}", x); 
} 

fn do_work(n: &mut u32) { 
    *n += 5; 
} 

あなたはそれが何と思いますか? Here it is on the playground

は今、このコードを見て:

fn main() { 
    let mut x = 5; 

    do_work(x); 

    println!("{}", x); 
} 

fn do_work(mut n: u32) { 
    n += 5; 
} 

何をこのプリントを思いますか? Here it is on the playground

回答は次のとおり

トップコードブロックプリント10。下のコードブロックは5を出力します。

可変参照を使用すると、変数xが格納されているメモリ内の場所を参照していることを意味します。関数境界を越えて、そこに格納されている値を変更することができます。メソッドが返ってprintln!ヒットすると、xの値が更新されます。

この具体例では、xはであり、これはCopy形質を実施する。 xdo_workメソッドに渡すと、xのコピーが作成されます。 do_workメソッドの本体では、n += 5は、コピーに5 を追加します。元のメモリブロックはまったく参照しません。

...どれが好ましいかを判断できません。

完全にユースケースに依存します。関数の境界を越えるときに元のメモリを参照する必要がありますか?変数を変更可能とマークした場合は、元のメモリを参照して更新したいと思う可能性が高くなります。その場合は、可変参照を使用します。関数内で変数をローカルに変更するだけの場合は、参照を必要としません。