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版本中可用。