2015-10-18 44 views
12

&の仕組みを理解していますが、これとrefの違いは何ですか?彼らは交換可能ですか?`&`と `ref`の違いは何ですか?

私が見つけた唯一の情報(Googleでのシンボルの検索はうまくいきません)はthis page on Rust By Exampleですが、2つの違いについては説明しません。 The Bookはあまり有益ではなく、refPatternsの章にのみ記載されています。しかし、そのコンテキスト外でもrefが使用されているようです。

refの用途は何ですか?&とは何ですか?

+0

*非常に関連していますが、正確には重複していません。これは 'ref'と'& 'の間にコンパイルされていないためです:http://stackoverflow.com/questions/27911656/rust-by-example-the-ref-パターン – Kroltan

答えて

12

refは、の左辺値(左端の値は多かれ少なかれアドレスを取ることができる値です)への参照をバインドするパターンで使用されます。

の値に使用されているため、パターンは正規表現から「後方に」移動することが重要です。

ここに簡単な例があります。我々はこれを持っていると仮定します。

let value = 42; 

我々は二つの方法でvalueへの参照をバインドすることができます:最初のケースで

let reference1 = &value; 
let ref reference2 = value; 

を、我々はvalueのアドレスを取得するためにオペレータとして&を使用しています。 2番目のケースでは、refパターンを使用して左辺値を「分解」します。いずれの場合も、変数のタイプは&i32です。

&もパターンで使用できますが、それは逆です:逆参照によって参照を分解します。我々が持っていると仮定します。

let value = 42; 
let reference = &value; 

我々は2つの方法でreference逆参照することができます

ここ
let deref1 = *reference; 
let &deref2 = reference; 

deref1deref2の両方のタイプはi32です。

ここに示すように、同じ表現を2つの方法で書くことは必ずしも可能ではありません。たとえば、&を使用して列挙型バリアントに格納されている値を参照することはできません。一致させる必要があります。

match option { 
    Some(ref value) => { /* stuff */ } 
    None => { /* stuff */ } 
} 

をあなたはそれ以外の値にアクセスするために&演算子を使用することができますルーストに方法はありませんので、:あなたはSomeの値への参照を取りたい場合たとえば、次のように記述する必要があります。

+0

'fn blah(ref a:i32){}'のような定義は 'fn blah(a:&i32)'と同じ意味ですが、両方とも表現できますか? – Kroltan

+4

@Kroltanいいえ、それらは同等ではありません。関数の引数の中のパターン( ':'の左側にあるもの)は実装の詳細です。呼び出し側は型(つまり、 ':'の右側にあるもの)のみを表示します。最初のケースは 'fn blah(tmp:i32){let ref a = tmp; ...} '。最初のものは 'blah(0)'のように呼び出され、2つ目は 'blah(&1)'のように呼び出されます。もちろん、関数自体、 'a'の型はどちらの場合でも'&i32'ですが、それは外部インタフェースだけです。 – huon

+0

@ huon-dbauppは、refバリアントが最初に値をコピー/移動することを意味しますか? – Kroltan

関連する問題