2015-02-09 14 views
5

:Julia: Otomatik tanıtım türü değişikliklerinden nasıl korunulur? Örneğin

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

Ben a::Uint8, b::Uint8 için methods(+)n otomatik terfi Uint64 etmektir böylece tanımlanmamış nedeniyle Böyle varsayalım. Her operasyondan sonra her şeyi önceden tanıtılan türe geri döndürmekten daha iyi bir yol var mı? Bu, yorumlayıcının otomatik olarak işleyebildiği bir şey değil mi (yani x'a eklendikten sonra Uint8 atanması gerekiyorsa)? Ben daha Julia 0,3 daha iyi bir yolu yoktur sanmıyorum

+1

Bu davranış, taşma riskini azaltmak için Julia 0.3'te kasıtlı bir seçim oldu. – tholy

+0

Eski davranışları yararlı bulabildiğim tek vaka, bunun geçerli olmadığı bir bencedi (int64 -> bigint otomatik olarak tanıtmaz). – user3467349

cevap

7

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

ama artık otomatik promosyon bunu yapmaz olarak Julia 0.4 içinde endişelenmenize gerek yok

:

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

Ah evet Julia'yı bir süredir kullanmadım - sadece 0.4'te denedim, göründüğü gibi daha küçük int ve uint tipleri için + + yöntemleri eklendi. – user3467349

+1

Evet, eski davranış için bir mantık vardı, ama çoğu insan için yeni davranışların çok daha anlamlı olduğunu düşünüyorum. – IainDunning

+1

Not x + y', julia 0.3 veya julia 0.4'te taşma olup olmadığını kontrol etmiyor. Bu bir endişe ise, 0.4 üzerinde tanıtım davranışını kendiniz taklit etmeniz gerekir. Örneğin, 'x' ve' y' '' UInt8' için '(UInt8, convert (UInt16, x) + y) 'yi dönüştürün. Oluşan değer 'UInt8' değerini aşarsa, 0.4 'dönüştür’ünde hata oluşur. – tholy