Dieser Code: ( Spielplatzlink )
fn main() {
let tiles = Default::default();
for row in &mut tiles {
for tile in row {
*tile = 0;
}
}
let tiles: [[usize; 3]; 3] = tiles;
}
Schlägt mit diesem Fehler fehl:
error[E0282]: type annotations needed
--> src/main.rs:5:13
|
4 | for tile in row {
| ---- consider giving `__next` a type
5 | *tile = 0;
| ^^^^^ cannot infer type for `_`
Typrückschluss (zu Recht) schlägt bei diesem Code fehl. Die Variable, die es zu reparieren vorschlägt, heißt jedoch __next
und ist in meinem Code nicht wirklich vorhanden. Es ist wahrscheinlich eine interne Variable, die vom Compiler generiert wird.
Nun, es wäre einfach genug, die Variable in diesem Fall nicht zu benennen.
diff --git a/src/librustc/infer/error_reporting/need_type_info.rs b/src/librustc/infer/error_reporting/need_type_info.rs
index 7352c14..25bfb3e 100644
--- a/src/librustc/infer/error_reporting/need_type_info.rs
+++ b/src/librustc/infer/error_reporting/need_type_info.rs
@@ -131,7 +131,10 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
labels.clear();
labels.push((pattern.span, format!("consider giving this closure parameter a type")));
} else if let Some(pattern) = local_visitor.found_local_pattern {
- if let Some(simple_name) = pattern.simple_name() {
+ // don't put internal desugared-loop identifier in user-facing
+ // message (Issue #51116)
+ let simple_name = pattern.simple_name().filter(|n| n.as_str() != "__next");
+ if let Some(simple_name) = simple_name {
labels.push((pattern.span, format!("consider giving `{}` a type", simple_name)));
} else {
labels.push((pattern.span, format!("consider giving the pattern a type")));
Aber im Grunde genommen ist dies kein gutes Label für Schleifen: Wir haben keine Syntax, um Schleifenvariablen mit Typannotationen zu versehen.
Das __next
kommt vom Entzuckern:
Aber im Grunde genommen ist dies kein gutes Label für Schleifen: Wir haben keine Syntax, um Schleifenvariablen mit Typannotationen zu versehen.
Stimmen Sie zu, wir sollten diesen Fall überprüfen.
Behoben in #52418.