Warum erlaubt der Rust-Compiler den Index außerhalb der Grenzen?

9

Kann jemand erklären, warum das kompiliert:

%Vor%

Beim Ausführen habe ich:

  

thread '' panisch bei 'index out of bounds: das len ist 3, aber der Index ist 4', ../ src / libcollections / vec.rs: 1132

    
maximi 22.07.2014, 21:58
quelle

2 Antworten

10

Um das Problem zu verstehen, müssen Sie darüber nachdenken, was der Compiler sieht.

In der Regel gibt es bei einem Compiler keine Gründe für den Wert eines Ausdrucks, sondern nur für den Typ . Also:

  • a hat den Typ Vec<i32>
  • 4 hat einen unbekannten ganzzahligen Typ
  • Vec<i32> implementiert Subscripting, also prüft a[4] type

Es ist nicht unbekannt, dass ein Compiler über -Werte nachdenkt, und es gibt verschiedene Möglichkeiten, es zu erhalten.

  • Sie können die Auswertung einiger Ausdrücke zum Zeitpunkt der Kompilierung zulassen (C ++ constexpr zum Beispiel)
  • Sie können Werte in Typen codieren (C ++ - Nicht-Typ-Vorlagenparameter, die Peanos Zahlen verwenden)
  • Sie können abhängige Typisierung verwenden, die die Lücke zwischen Typen und Werten
  • überbrückt

Rust unterstützt derzeit keine von diesen, und obwohl es Interesse für die ersten beiden gibt, wird es sicherlich nicht vor 1.0 gemacht werden.

Somit werden die Werte zur Laufzeit überprüft und die Implementierung von Vec wird korrekt ausgeführt (hier fehlgeschlagen).

    
Matthieu M. 26.07.2014, 14:22
quelle
9

Wenn Sie auf Elemente von Vec mit Indexprüfung zugreifen möchten, können Sie Vec als Slice und dann mit get Methode . Betrachten Sie zum Beispiel den folgenden Code .

%Vor%

Dies gibt aus:

%Vor%     
mwhittaker 22.07.2014 22:41
quelle

Tags und Links