Muster Bindung kann einige mit bekommen;)
Um zu verstehen, was der Compiler tut, können Sie den let _:() = ...;
Trick verwenden können. Wenn Sie eine Variable vom Typ ()
zuweisen, erzwingen Sie, dass der Compiler eine Fehlermeldung ausgibt, die Ihnen den Typ angibt, der für Ihre Variable abgeleitet wurde.
Im ersten Beispiel:
let vec = vec![1, 2, 3];
let &y = &vec;
let _:() = y;
erhalten wir:
<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
die Art der y
Vec<i32>
ist.
Was es bedeutet, ist, dass Sie sind:
- Borrowing
vec
in eine temporäre
- Versuch
vec
in y
zu bewegen, was verboten ist, weil vec
bereits entliehen ist.
Der äquivalent würde richtige Code sein:
let vec = vec![1, 2, 3];
let y = vec;
Im zweiten Beispiel:
let vec = vec![1, 2, 3];
let ref y = &vec;
let _:() = y;
erhalten wir:
<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
Somit ist y
&&Vec<i32>
.
Dies lassen Sie uns sehen, dass let ref a = b;
in der Regel let a = &b;
entspricht und daher in diesem Fall: let y = &&vec;
.
ref
ist für die Destrukturierung gemacht; zum Beispiel, wenn Sie hatte:
let vec = Some(vec![1, 2, 3]);
if let Some(ref y) = vec {
}
Sie ref
hier in der Lage sein zu binden y
zu ohne bewegen, obwohl vec
hier eingeben Option<Vec<i32>>
hat verwenden würde. In der Tat ist der Zweck von ref
, eine Referenz innerhalb eines existierenden Objekts während der Destrukturierung zu nehmen.
Im Allgemeinen werden Sie in einer let
Anweisung ref
nicht verwenden.
Gibt es ein Legit Fall sehen, wo wir wie etwas verwenden wollen, 'lassen & y = &vec;'? – WiSaGaN
@WiSaGaN: Ich kann mir keine vorstellen. –
@WiSaGaN: Diese Konstruktion kann zum Beispiel in Verschlüssen verwendet werden. Es wird in der Funktion in Vec beibehalten und so weiter. –