Julia 我可以为外部构造函数中的参数类型构建无参数构造函数吗?
为了实例化一个类型,比如Julia 我可以为外部构造函数中的参数类型构建无参数构造函数吗?,julia,Julia,为了实例化一个类型,比如x=MyType{Int}() 我可以定义一个内部构造函数 immutable MyType{T} x::Vector{T} MyType() = new(T[]) end 使用外部构造函数是否可以实现相同的目标?我可能错了,但是如果您不能像这样构建无参数函数: julia> f{T}() = show(T) WARNING: static parameter T does not occur in signature for f at none
x=MyType{Int}()
我可以定义一个内部构造函数
immutable MyType{T}
x::Vector{T}
MyType() = new(T[])
end
使用外部构造函数是否可以实现相同的目标?我可能错了,但是如果您不能像这样构建无参数函数:
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[])
但是julia需要查看调用中的类型才能知道您想要哪种类型。这可以使用以下语法完成:
(::Type{MyType{T}}){T}() = MyType{T}(T[])
第一组括号中的内容描述了被调用的对象::T
表示“类型T”,因此这是一个用于调用类型为类型{MyType{T}}
的对象的定义,它表示对象本身。下一步{T}
意味着T
是此定义的一个参数,它的值必须可用才能调用此定义。所以MyType{Int}
匹配,但是MyType
不匹配。从那时起,语法应该很熟悉
这个语法肯定有点复杂和不直观,我们希望在该语言的未来版本(希望是v0.6)中对其进行改进。是的,但它不被视为MyType{T}的外部构造函数。我应该补充一点,这个语法只在v0.5版本中可用。