2014-10-27 14 views
6

Na http://julia.readthedocs.org/en/latest/manual/conversion-and-promotion/, jest dyskusja na temat dodawania liczb całkowitych do pływaków i tak dalej, a i na koniec mówiKiedy używany jest konwerter Julii()?

User-defined types can easily participate in this promotion system by defining methods for conversion to and from other types, and providing a handful of promotion rules defining what types they should promote to when mixed with other types.

Z tego wywnioskowałem, że przy określaniu własny typ liczbowy, ja po prostu potrzebne, aby określić, w jaki przekonwertować go do znanego typu, aby działał z funkcjami na nim. Ale próbowałem tego i nie wydaje się działać:

julia> type MyType 
      n::Int 
     end 

julia> convert(::Type{Int}, x::MyType) = x.n 
convert (generic function with 1 method) 

julia> convert(Int, MyType(1)) 
1 

julia> MyType(1) + 1 
ERROR: `+` has no method matching +(::MyType, ::Int64) 

Odpowiedz

7

Istnieją dwa problemy z kodem:

  • arytmetyczne operatory takie jak + promują tylko podtypy Number;
  • Musisz zdefiniować regułę promocji oprócz funkcji konwersji.

Poniższy powinien robić to, co chcesz:

module Test 

import Base: convert, promote_rule 

type MyType <: Number 
    n :: Int 
end 

convert(::Type{Int}, x::MyType) = x.n 

promote_rule(::Type{MyType}, ::Type{Int}) = Int 

end 
+0

można wyjaśnić różnicę pomiędzy promocją i nawrócenia? – asmeurer

+5

'convert' mówi kompilatorowi, jak wykonać konwersję z' MyType' na 'Int', gdy już zostało to postanowione. "promot_rule" mówi kompilatorowi, jaką konwersję wykonać, gdy widzi zarówno 'Int' jak i' MyType' jako operandy - czy konwertować 'MyType' na' Int' lub 'Int' na' MyType'. – jch

+0

Po otrzymaniu kodu otrzymuję komunikat "BŁĄD: brak promocji dla MyType i Int64 w + at promotion.jl: 158". – asmeurer