2015-11-06 9 views

Odpowiedz

1

Można to zrobić przy użyciu następującej składni:

(::Type{MyType{T}}){T}() = MyType{T}(T[]) 

Rzecz w pierwszym zestawie nawiasach opisuje nazwie obiektu. ::T oznacza "typu T", więc jest to definicja dla wywołania obiektu typu Type{MyType{T}}, co oznacza sam obiekt o nazwie . Dalej {T} oznacza, że ​​parametr T jest parametrem tej definicji, a jego wartość musi być dostępna w celu wywołania tej definicji. Tak więc MyType{Int} pasuje, ale MyType nie. Od tego momentu składnia powinna być znana.

Ta składnia jest zdecydowanie nieco dziwaczna i nieintuicyjna, i mamy nadzieję poprawić ją w przyszłej wersji tego języka, mam nadzieję, że v0.6.

+0

Należy dodać, że ta składnia jest dostępna tylko od wersji v0.5. –

0

mogę się mylić, ale jeśli nie można budować bez parametrów funkcji tak:

julia> f{T}() = show(T) 
WARNING: static parameter T does not occur in signature for f at none:1. 
The method will not be callable. 
f (generic function with 1 method) 

dlatego nie będzie w stanie to zrobić:

julia> immutable MyType{T} 
      x::Vector{T} 
     end 

julia> MyType{T}() = MyType{T}(T[]) 
WARNING: static parameter T does not occur in signature for call at none:1. 
The method will not be callable. 
MyType{T} 

julia> x = MyType{Int}() 
ERROR: MethodError: `convert` has no method matching convert(::Type{MyType{Int64}}) 
... 

Każda zewnętrzna konstruktor jest również funkcjonować.

0

Można powiedzieć

f(T::Type) = show(T) 

a także

MyType(T::Type) = MyType(T[]) 

Ale Julia musi zobaczyć typ w zaproszeniu wiedzieć, które chcesz.

+0

Tak, ale nie jest to uważane za zewnętrzny konstruktor dla MyType {T} –

Powiązane problemy