2015-02-09 8 views
5

Per esempio:Julia: come evitare modifiche al tipo di promozione automatica?

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

Presumo che ciò accade perché methods(+) per a::Uint8, b::Uint8 non è definito in modo n è auto-promosso a Uint64. C'è un modo migliore per affrontare questo problema, piuttosto che restituire tutto al suo tipo pre-promosso dopo ogni operazione? Non è questo qualcosa che l'interprete dovrebbe essere in grado di gestire automaticamente (ad esempio, se è stato detto chedeve essere assegnato a Uint8 dopo l'aggiunta)?

+1

Questo comportamento è stato una scelta deliberata in julia 0.3, per ridurre il rischio di overflow. – tholy

+0

L'unico caso per il quale avrei trovato utile il vecchio comportamento era che ne pensavo uno per il quale non era applicabile (int64 -> bigint non promuove automaticamente). – user3467349

risposta

7

Non credo ci sia un modo migliore di Julia 0,3 di

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

ma in Julia 0.4 non è necessario preoccuparsi in quanto essa non lo fa la promozione automatica più:

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

Ah sì, non avevo usato Julia per un po '- l'ho appena provato in '0.4', sembra che i metodi' + 'per i tipi int e uint più piccoli siano stati aggiunti alla spedizione. – user3467349

+1

Sì, c'era una certa logica nel vecchio comportamento, ma penso che per molte persone il nuovo comportamento abbia molto più senso. – IainDunning

+1

Si noti che 'x + y' non controlla l'overflow su julia 0.3 o julia 0.4. Se questo è un problema, su 0.4 dovrai imitare il comportamento della promozione da solo, ad es., Converti (UInt8, converti (UInt16, x) + y) 'per' x' e 'y' entrambi 'UInt8'. Su 0.4 'convert' genererà un errore se il valore risultante oltrepassa' UInt8'. – tholy