2016-05-19 25 views
2

Als Beispiel bei aussehen:Unexpected Typinferenz Fehler in Rust

type Mat4x4<T> = [T; 16]; 

fn main() { 
    let m : Mat4x4 = [0.4323f32; 16]; 
    println!("{:?}", m); 
} 

Compiler nicht Matrix Typinferenz kann, ist der Arbeits Code wie folgt:

type Mat4x4<T> = [T; 16]; 

fn main() { 
    let m : Mat4x4<f32> = [0.4323f32; 16]; 
    println!("{:?}", m); 
} 

Ich weiß nicht, vielleicht Dies ist eine erwartete Handlung.

Antwort

4

Dies ist kein Typinferenz Ausgabe:

type Mat4x4<T> = [T; 16]; 

fn main() { 
    let m : Mat4x4 = [0.4323f32; 16]; 
    println!("{:?}", m); 
} 

ergibt die folgende Fehlermeldung:

<anon>:4:13: 4:19 error: wrong number of type arguments: expected 1, found 0 [E0243] 
<anon>:4  let m : Mat4x4 = [0.4323f32; 16]; 
        ^~~~~~ 

Die Beschwerde ist hier, dass Mat4x4 kein Typ ist, es ist ein Vorlage oder Blueprint um einen Typ zu erstellen.

Eine Analogie wäre, dass Mat4x4 ist ein Waffeleisen, und Mat4x4<f32> ist eine Waffel, die daraus hervorgeht. Wenn Sie das Waffeleisen serviert werden (natürlich mit Ahornsirup), werden Sie wahrscheinlich enttäuscht sein!

Das gleiche gilt hier: Wenn Sie dem Compiler den Entwurf geben, wo er das Endprodukt erwartet, signalisiert es Ihnen, dass es nicht das war, was es erwartet hat.


Sie können ein Dummy-Argument (_) liefern, und es wird gefolgert werden:

let m: Mat4x4<_> = [0.4323f32; 16]; 
+0

Ich mochte dein Waffelbeispiel. : D –

4

Sie können nicht erforderlichen Typ Parameter auslassen, aber man konnte _ es schließen:

let m : Mat4x4<_> = [0.4323f32; 16]; 

Alternativ könnten Sie einen Standardtyp Parameter hinzufügen, damit Sie die <…> weglassen könnte, wenn der Typ T genau ist f32 (aber Dies ist keine Typinferenz, Sie müssen immer noch Mat4x4<f64> explizit schreiben).

type Mat4x4<T=f32> = [T; 16]; 
... 
let m: Mat4x4 = [0.4323f32; 16]; 
+0

In den meisten der Zeiten, die Sie brauchen, um für Inferenz nicht verwenden ‚_‘, das ist etwas, erwartet hier? –

+0

@ HosseinNoroozpour: Sie meinen, wenn Sie den gesamten Typ, z. 'Lassen Sie m = [0.4f32; 16]; '? Aber hier beschränken Sie es auf ein 'Mat4x4 '. – kennytm