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;
、deref1
とderef2
の両方のタイプはi32
です。
ここに示すように、同じ表現を2つの方法で書くことは必ずしも可能ではありません。たとえば、&
を使用して列挙型バリアントに格納されている値を参照することはできません。一致させる必要があります。
match option {
Some(ref value) => { /* stuff */ }
None => { /* stuff */ }
}
をあなたはそれ以外の値にアクセスするために&
演算子を使用することができますルーストに方法はありませんので、:あなたはSome
の値への参照を取りたい場合たとえば、次のように記述する必要があります。
*非常に関連していますが、正確には重複していません。これは 'ref'と'& 'の間にコンパイルされていないためです:http://stackoverflow.com/questions/27911656/rust-by-example-the-ref-パターン – Kroltan