パターン;ためには)
あなたがlet _:() = ...;
トリックを使用することができ、コンパイラが何をするのか理解します。タイプ()
の変数に代入することにより、変数に対して推論された型を示すエラーメッセージがコンパイラに出力されます。最初の例で
:
let vec = vec![1, 2, 3];
let &y = &vec;
let _:() = y;
我々が得る:
<anon>:5:17: 5:18 error: mismatched types:
expected `()`,
found `collections::vec::Vec<_>`
(expected(),
found struct `collections::vec::Vec`) [E0308]
<anon>:5 let _:() = y;
^
<anon>:5:17: 5:18 help: see the detailed explanation for E0308
y
のタイプはVec<i32>
です。
- 借入
vec
vec
は既に借りているので、禁止され、y
にvec
を移動しようとすると、
- 一時的
に:それは何を意味
は、あなたがしていることです。
等価正しいコードは次のようになります
let vec = vec![1, 2, 3];
let ref y = &vec;
let _:() = y;
我々が得る:第2の例で
let vec = vec![1, 2, 3];
let y = vec;
<anon>:5:17: 5:18 error: mismatched types:
expected `()`,
found `&&collections::vec::Vec<_>`
(expected(),
found &-ptr) [E0308]
<anon>:5 let _:() = y;
^
<anon>:5:17: 5:18 help: see the detailed explanation for E0308
したがって、y
は、&&Vec<i32>
である。
これは、let ref a = b;
が一般にlet a = &b;
と等価であることを示しているので、この場合はlet y = &&vec;
です。
ref
は、非構造化のために作られています。たとえば、あなたが持っていた場合:
let vec = Some(vec![1, 2, 3]);
if let Some(ref y) = vec {
}
をあなたはここでvec
がOption<Vec<i32>>
を入力しているにもかかわらず、移動せずにy
にバインドできるようにするには、ここでref
を使用します。確かに、ref
の目的は、中に参照内の既存のオブジェクトを取ることです。
一般にlet
の文では、ref
は使用しません。
上でより多くの例を見ることができ、我々は 'てみましょう&Y = &vec;'のようなものを使用したい合法的なケースはありますか? – WiSaGaN
@WiSaGaN:私は考えることができません。 –
@WiSaGaN:この構造は、たとえばクロージャーで使用できます。 Vecなどの関数の保持に使用されています。 –