Rust: Erreur déroutante lors de l'utilisation d'un littéral de structure comme itérateur

Créé le 11 janv. 2018  ·  1Commentaire  ·  Source: rust-lang/rust

fn main() {
    for _ in std::ops::Range { start: 0, end: 10 } {}
}

// error: expected type, found `0`
//  --> src/main.rs:2:39
//   |
// 2 |     for _ in std::ops::Range { start: 0, end: 10 } {}
//   |                                       ^ expecting a type here because of type ascription

// error[E0423]: expected value, found struct `std::ops::Range`
//  --> src/main.rs:2:14
//   |
// 2 |     for _ in std::ops::Range { start: 0, end: 10 } {}
//   |              ^^^^^^^^^^^^^^^ did you mean `std::ops::Range { /* fields */ }`?

C'est déroutant ici, car cela suggère d'utiliser exactement ce que l'utilisateur a tapé. Il devrait plutôt suggérer à l'utilisateur de mettre entre parenthèses le littéral de structure.
(Il y a probablement une raison pour laquelle cela n'analyse pas tel quel, mais si ce n'est pas le cas, cela semble être un cas agréable à gérer.)

A-diagnostics A-parser C-enhancement T-compiler

Commentaire le plus utile

👍 sur l'amélioration des diagnostics ici.

Il y a probablement une raison pour laquelle cela n'analyse pas tel quel

Le problème est que lorsque l'analyseur voit le { après Range , il ne sait pas s'il s'agit d'un littéral de structure ou du début du corps de la boucle, et au moment de l'analyse, il n'a aucune idée que Range est une structure, pas une constante.

>Tous les commentaires

👍 sur l'amélioration des diagnostics ici.

Il y a probablement une raison pour laquelle cela n'analyse pas tel quel

Le problème est que lorsque l'analyseur voit le { après Range , il ne sait pas s'il s'agit d'un littéral de structure ou du début du corps de la boucle, et au moment de l'analyse, il n'a aucune idée que Range est une structure, pas une constante.

Cette page vous a été utile?
0 / 5 - 0 notes