x = MyType{Int}()
外側のコンストラクタでパラメトリック型のパラメータのないコンストラクタを構築できますか?
のような型をインスタンス化するために、内部コンストラクタを定義できます。
immutable MyType{T}
x::Vector{T}
MyType() = new(T[])
end
外側のコンストラクタを使用して同じ目的を達成できますか?
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[])
を言うことができますが、ジュリアは、あなたがしたいのかを知るためにコールタイプを参照する必要があります。
はい、MyType {T}の外部コンストラクタとはみなされません –
この構文はv0.5以降でのみ使用可能です。 –