modo "canonica" per definire un costruttore interna di tipo parametrico è:
immutable MyType{T<:"specific abstract type"}
x::T
MyType(x) = new(x + x)
end
invece di dichiarare la funzione generale MyType(x)
che può accettare arbitrario valori, julia ha definito automaticamente molti specifici MyType(x::T)
s dove T<:"specific abstract type"
. quindi i tuoi ultimi due esempi sono equivalenti a questo.
come sappiamo, la funzionalità di new
consiste nel creare nuovi oggetti, non è necessario renderlo parametrico, perché abbiamo già applicato i vincoli prima di chiamare questa funzione.
Cordiali saluti, il costruttore di default è diverso da quelli di cui sopra:
immutable MyType{T<:"specific abstract type"}
x::T
end
qui, Julia si fa una cosa: definire un costruttore esterno:
MyType{T<:"specific abstract type"}(x::T) = MyType{T}(x)
julia> methods(MyType)
3-element Array{Any,1}:
call{T<:Integer}(::Type{MyType{T<:Integer}}, x::T<:Integer) at none:2
call{T}(::Type{T}, arg) at essentials.jl:56
call{T}(::Type{T}, args...) at essentials.jl:57
ma:
julia> immutable MyType{T<:Integer}
x::T
MyType(x) = new(x)
end
julia> methods(MyType)
2-element Array{Any,1}:
call{T}(::Type{T}, arg) at essentials.jl:56
call{T}(::Type{T}, args...) at essentials.jl:57
ciò significa che potrebbe essere necessario definire manualmente tale costruttore esterno, se si desidera un costruttore interno personalizzato.