2014-10-27 14 views
6

A http://julia.readthedocs.org/en/latest/manual/conversion-and-promotion/, v'è una discussione circa l'aggiunta di numeri interi per galleggianti e così via, e e alla fine si diceQuando viene utilizzato il convert() di Julia?

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.

Da questo ho dedotto che, nel definire il mio tipo numerico, ho semplicemente bisogno di definire come per convertirlo in un tipo noto affinché funzioni con funzioni su di esso. Ma ho provato questo e non sembra funzionare:

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) 

risposta

7

Ci sono due problemi con il tuo codice:

  • operatori aritmetici come + solo promuovere sottotipi di Number;
  • è necessario definire una regola di promozione oltre alla funzione di conversione.

Il seguente dovrebbe fare ciò che si vuole:

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

Ci può spiegare la differenza tra la promozione e la conversione? – asmeurer

+5

'convert' dice al compilatore come eseguire la conversione da' MyType' a 'Int' quando è già stato deciso di farlo. 'promote_rule' dice al compilatore quale conversione eseguire quando vede sia' Int' che 'MyType' come operandi - se convertire' MyType' in 'Int' o' Int' in 'MyType'. – jch

+0

Con il tuo codice mi viene visualizzato 'ERRORE: nessuna promozione esiste per MyType e Int64 in + su promotion.jl: 158'. – asmeurer

Problemi correlati