Wie kann eine Referenz in Rust ein Zeiger auf einen Zeiger auf einen Zeiger sein?

8

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:

%Vor%

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?

    
Elf Sternberg 05.04.2017, 17:10
quelle

1 Antwort

9

Die Regeln sind nicht ad-hoc noch wirklich esoterisch. Untersuchen Sie den Typ von v und verschiedene Dereferenzen:

%Vor%

Sie erhalten:

  1. v - & gt; %Code%
  2. &std::vec::Vec<i32> - & gt; %Code%
  3. *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 :

  1. Wenn der Typ die Methode enthält, verwenden Sie sie und beenden Sie die Suche.
  2. Wenn eine Referenz auf den Typ die Methode verwendet, verwenden Sie sie und beenden Sie die Suche.
  3. Wenn der Typ dereferenziert werden kann, tun Sie dies und kehren dann zu Schritt 1 zurück.
  4. Andernfalls schlägt die Suche fehl.
  

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.

    
Shepmaster 05.04.2017, 17:24
quelle

Tags und Links