2015-02-09 7 views
5

Zum Beispiel:Julia: Wie kann man Änderungen am Auto-Promotion-Typ vermeiden?

n::Uint8 = 0x00 
x::Uint8 = n + 0x10 
ERROR: type: typeassert: expected Uint8, got Uint64 

Ich nehme an, dies geschieht, weil methods(+) für a::Uint8, b::Uint8 nicht so definiert ist n wird automatisch gefördert Uint64. Gibt es einen besseren Weg, damit umzugehen, als nach jeder Operation alles wieder auf den vorgeförderten Typ zurück zu werfen? Ist das nicht etwas, das der Interpreter automatisch verarbeiten kann (d. H., Wenn nach der Hinzufügung x eine Uint8 zugewiesen wird)?

+1

Dieses Verhalten war eine bewusste Wahl in Julia 0,3, um das Risiko von Überlauf zu reduzieren. – tholy

+0

Der einzige Fall, für den ich altes Verhalten nützlich gefunden hätte, war ich glaube, für den es nicht galt (int64 -> bigint fördert nicht automatisch). – user3467349

Antwort

7

Ich glaube nicht, gibt es eine bessere Art und Weise in Julia 0,3 als

julia> typeof(uint8(0x00 + 0x10)) 
UInt8 

aber in Julia 0.4 brauchen Sie sich keine Sorgen machen, da es nicht, dass die automatische Förderung nicht mehr tun:

julia> typeof(0x00 + 0x10) 
UInt8 
+0

Ah yeah Ich hatte Julia schon lange nicht mehr benutzt - ich habe es einfach in '0.4' ausprobiert, es scheint,' '' Methoden für kleinere int und uint Typen wurden zum Versand hinzugefügt. – user3467349

+1

Ja, es gab eine gewisse Logik im alten Verhalten, aber ich denke, dass das neue Verhalten für die meisten Leute viel mehr Sinn macht. – IainDunning

+1

Beachten Sie, dass 'x + y' nicht auf Überlauf von Julia 0.3 oder Julia 0.4 prüft. Wenn das ein Problem ist, müssen Sie bei 0,4 das Werbungsverhalten selbst nachahmen, z. B. 'convert (UInt8, convert (UInt16, x) + y)' für 'x' und' y' beide 'UInt8'. Bei 0.4 'convert' wird ein Fehler ausgegeben, wenn der resultierende Wert 'UInt8' überschreitet. – tholy

Verwandte Themen