2016-09-20 3 views
3

Ich war mit einigem Code herumspielen und machte folgende Beobachtung:Wann sind numerischen Literalen Standardtypen zugewiesen?

let x = 1; 
let() = x; 

error: mismatched types [E0308] 
note: expected type `_` 
note:  found type `()` 

Das ist offensichtlich nicht, aber ich habe erwartet, der Fehler, dass der erwartete Typ i32 war zu erklären, nicht _. Ich fand heraus, dass das Gleiche mit einem Fließkomma eines nicht spezifizierten Typs geschieht, z. 1.0.

Warum ist es so? Sollte der Typ nicht schon als Standard bekannt sein?

aktualisieren: ab Rust 1.12, ist die Fehlermeldung informative:

expected integral variable, found() 

= note: expected type `{integer}` 
= note: found type `()` 
+0

Ich denke, der Fehler ist zu offensichtlich. Der Typchecker ist nicht weit genug gekommen, um Standardwerte einzufügen, da dies niemals funktionieren kann. Ich habe nur die Standardwerte in Fehlermeldungen gesehen, als es eine ernste Unordnung von Schließungen und generischen Methoden war –

Antwort

8

Rust hat von der Initialisierung Inferenz nicht nur geben, sondern von jedem Gebrauch. Daher muss sein Typ-Checker jede Verwendung einer Variablen prüfen, um zu entscheiden, um welchen Typ es sich handelt, und muss Typen ableiten und überprüfen, während sie fortschreitet.

Dies bedeutet, dass die let() = x; Teil des gleichen Prozesses ist. Es ist eine Verwendung von x und muss daher überprüft werden, um zu sehen, welcher Betontyp x sein könnte. Die Tatsache, dass kein möglicher Typ mit () übereinstimmen kann, wird zur selben Zeit entdeckt, als der Compiler noch versucht, den Typ x abzuleiten, und deshalb wurde kein Standardwert gewählt, da der Standard nur verwendet wird, wenn der Compiler alle Verwendungen betrachtet hat von x und nichts gefunden.

Verwandte Themen