Rust: erkennen, wenn "unbeschränkte Typparameter" explizit für einen fn-Aufruf bereitgestellt werden könnten

Erstellt am 21. Feb. 2017  ·  3Kommentare  ·  Quelle: rust-lang/rust

Aufbauend auf https://github.com/rust-lang/rust/pull/39361 möchten wir vielleicht überlegen, wann Benutzer explizite Typparameter zu einem fn-Aufruf hinzufügen sollten. Ich stelle mir ein Beispiel so vor:

fn foo<T>() { }

fn main() {
    foo();
}

Es wäre schön vorzuschlagen, dass der Benutzer foo::<T> für etwas explizites T schreibt. Dies erfordert ein wenig Nachdenken:

Wann möchten wir dies vorschlagen, anstatt eine lokale Variable zu kommentieren? Ich würde es vorziehen, die Anmerkung an die lokale Variable anzuhängen, aber vielleicht nicht, wenn der Typ der lokalen Variablen eine komplexe Sache ist, die den nicht abgeleiteten Typ tief in ihr erwähnt, während das Annotieren der Funktion es uns ermöglichen würde, den nicht abgeleiteten Typ direkt anzugeben .

Ein Beispiel:

fn foo<T>() -> Option<T> { }

fn main() {
    let x = foo();
}

Sollten wir vorschlagen, x: Option<T> oder foo::<T> zu kennzeichnen? Dieser Fall ist grenzwertig, aber wenn Sie Option durch einen komplexeren Typ ersetzen, wird das Gleichgewicht weiter gekippt.

Was tun wir, wenn das fn viele Typen akzeptiert und wir sie teilweise kennen? Wir haben das Problem zuvor umgangen, was zu tun ist, wenn wir einige Informationen haben, aber nicht alle. Aber es fühlt sich so an, als ob es hier wichtiger sein könnte. Ein Beispiel:

fn foo<T, U>() -> T { }

fn main() {
    let x: i32 = foo();
}

Hier kennen wir T , aber nicht U . Sollten wir foo::<_, XXX> vorschlagen? Wie formulieren wir die XXX , um dem Benutzer anzuzeigen, dass dies das ist, was er bereitstellen muss?

cc @cengizIO - interessant zu verfolgen?

cc @estebank @jonathandturner – Gedanken zur Formulierung?

A-diagnostics C-enhancement E-needs-mentor T-compiler WG-compiler-errors

Hilfreichster Kommentar

Aktueller Output:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required

Einige Optionen:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required
   = note: generic parameter `U` needs to be specified for foo::<T, U>()
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |                  |
   |                  you can specify the generic parameter here using `foo::<_, U>()`
   |
   = note: generic parameter `U` needs to be specified for `fn foo::<T, U>() -> T`
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U` in `fn foo<T, U>() -> T`
   |                  |
   |                  specify `U` using `foo::<_, U>()`
   |

Alle 3 Kommentare

Hallo @nikomatsakis

Ich werde daran arbeiten.

Danke noch einmal!

Aktueller Output:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required

Einige Optionen:

error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |
   = note: type annotations or generic parameter binding required
   = note: generic parameter `U` needs to be specified for foo::<T, U>()
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U`
   |                  |
   |                  you can specify the generic parameter here using `foo::<_, U>()`
   |
   = note: generic parameter `U` needs to be specified for `fn foo::<T, U>() -> T`
error[E0282]: type annotations needed
  --> $DIR/xxx.rs:xx:xx
   |
14 |     let x: i32 = foo();
   |                  ^^^ cannot infer type for `U` in `fn foo<T, U>() -> T`
   |                  |
   |                  specify `U` using `foo::<_, U>()`
   |

Besonders dieser Hinweis lässt meine Augen glasig werden:

   = note: type annotations or generic parameter binding required

Lassen Sie uns das auf jeden Fall entfernen. :)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen