2015-11-06 162 views

回答

1

这可以使用下面的语法来完成:

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

在第一组括号的事情描述了所谓的对象。 ::T表示“T型”,因此这是调用Type{MyType{T}}类型对象的定义,表示对象MyType{T}本身。接下来{T}意味着T是该定义的参数,并且为了调用此定义,其值必须可用。所以MyType{Int}匹配,但MyType没有。从那里开始,语法应该很熟悉。

这个语法肯定有点不合时宜,我们希望在未来的语言版本中改进它,希望v0.6。

+0

我应该补充一点,该语法仅适用于v0.5。 –

0

我可能是错的,但如果你不能建立这样的参数的函数:

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}}) 
... 

每个外部构造也是功能。

0

你可以说

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

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

但朱莉娅需要看到的类型在调用知道你想要的。

+0

是的,但它不被认为是MyType的外部构造函数{T} –