我可以在外部构造函数中为参数类型构建一个无参数构造函数吗?
问题描述:
为了实例化一个像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[])
但朱莉娅需要看到的类型在调用知道你想要的。
+0
是的,但它不被认为是MyType的外部构造函数{T} –
我应该补充一点,该语法仅适用于v0.5。 –