Warum ist das Ausleihen einer & mut-Referenz von einem unveränderlichen Array manchmal möglich?

8

Versuchen wir, diesen Code zu kompilieren:

%Vor%

Kompilierungsfehler:

%Vor%

Warum ist a[0].bar() OK, aber a[j % 2].bar() schlägt fehl? Ist es ein Compilerfehler?

    
chabapok 19.11.2017, 08:58
quelle

1 Antwort

4
  

Ist es ein Compiler Bug?

Ja . Es ist in Rust 1.25.0-nächtlich (2018-01-09 61452e506f0c88861cccaeea4ced3419bdb3cbe0) von PR 47167

fixiert / p>

Die kurze Version besteht darin, dass es zwei Arten der Indizierung gibt, die als "eingebaute Indexierung" und "überladene Indexierung" bezeichnet werden. Wie Sie vielleicht aus den Namen erraten können, ist einer für den Compiler intrinsischer und der andere ist benutzerdefinierbarer.

In diesem Fall führt die überladene Indexierung ein unnötiges Ausleihen des Arrays aus und löst die Warnung aus. Sie können das Problem umgehen, indem Sie den Compiler-Job vom Typ Inferenz vereinfachen:

%Vor%

Wenn Sie explizit den Index als usize angeben, verwendet der Code jetzt die integrierte Indizierung.

    
Shepmaster 19.11.2017, 18:18
quelle

Tags und Links