Das heutige Rust-Mysterium stammt aus Abschnitt 4.9 der Rust-Programmiersprache, Erstausgabe. Das Beispiel von Referenzen und Ausleihen hat dieses Beispiel:
%Vor% Das scheint vernünftig. Es druckt "6", was Sie erwarten würden, wenn die
v
von sum_vec
ist eine C ++ Referenz; es ist nur ein Name für eine Erinnerung
location, der Vektor v1
, den wir in main()
definiert haben.
Dann habe ich den Körper von sum_vec
durch folgendes ersetzt:
Es hat zusammengestellt und funktioniert wie erwartet. Okay, das ist nicht ... völlig verrückt. Der Compiler versucht mein Leben einfacher zu machen, das verstehe ich. Verwirrend, etwas, das ich als einen spezifischen Tic der Sprache auswendig lernen muss, aber nicht ganz verrückt. Dann habe ich versucht:
%Vor%Es hat noch funktioniert! Was zum Teufel?
%Vor% type [i32] cannot be dereferenced
. Oh, Gott sei Dank, etwas, das Sinn macht. Aber ich hätte das fast zwei Iterationen früher erwartet!
Referenzen in Rust sind nicht C ++ "Namen für einen anderen Ort im Speicher", aber was sind sie? Sie sind auch keine Zeiger, und die Regeln über sie scheinen entweder esoterisch oder sehr ad hoc zu sein. Was passiert so, dass eine Referenz, ein Zeiger und ein Zeiger auf einen Zeiger hier gleich gut funktionieren?
Die Regeln sind nicht ad-hoc noch wirklich esoterisch. Untersuchen Sie den Typ von v
und verschiedene Dereferenzen:
Sie erhalten:
v
- & gt; %Code%
&std::vec::Vec<i32>
- & gt; %Code%
*v
- & gt; %Code%
Die erste Dereferenzierung, die Sie bereits verstehen. Die zweite Dereferenzierung ist dem std::vec::Vec<i32>
Merkmal zu verdanken. **v
Dereferenzen auf [i32]
.
Wenn Sie Methoden suchen, gibt es ein einfaches Regelwerk :
Referenzen in Rust sind keine C ++ "Namen für einen anderen Ort im Speicher",
Sie sind absolut Namen für einen Ort in Erinnerung. Tatsächlich kompilieren sie sich auf den gleichen C / C ++ Zeiger, den Sie kennen.
Tags und Links rust