爲了實例化一個像x = MyType{Int}()
我可以在外部構造函數中爲參數類型構建一個無參數構造函數嗎?
我可以定義一個內部構造函數。
immutable MyType{T}
x::Vector{T}
MyType() = new(T[])
end
使用外部構造函數可以實現相同的目標嗎?
爲了實例化一個像x = MyType{Int}()
我可以在外部構造函數中爲參數類型構建一個無參數構造函數嗎?
我可以定義一個內部構造函數。
immutable MyType{T}
x::Vector{T}
MyType() = new(T[])
end
使用外部構造函數可以實現相同的目標嗎?
這可以使用下面的語法來完成:
(::Type{MyType{T}}){T}() = MyType{T}(T[])
在第一組括號的事情描述了所謂的對象。 ::T
表示「T型」,因此這是調用Type{MyType{T}}
類型對象的定義,表示對象MyType{T}
本身。接下來{T}
意味着T
是該定義的參數,並且爲了調用此定義,其值必須可用。所以MyType{Int}
匹配,但MyType
沒有。從那裏開始,語法應該很熟悉。
這個語法肯定有點不合時宜,我們希望在未來的語言版本中改進它,希望v0.6。
我可能是錯的,但如果你不能建立這樣的參數的函數:
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)
因此,你將無法做到這一點:
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}})
...
每個外部構造也是功能。
你可以說
f(T::Type) = show(T)
也
MyType(T::Type) = MyType(T[])
但朱莉婭需要看到的類型在調用知道你想要的。
是的,但它不被認爲是MyType的外部構造函數{T} –
我應該補充一點,該語法僅適用於v0.5。 –