2015-11-06 4 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}の外部コンストラクタとはみなされません –

関連する問題