2017-07-20 12 views
4

julia 0.6の新しいwhere構文についてちょっと混乱しています。私は明示的な変換を行うことなく、辞書のベクトルを受け取る機能が欲しいjuliaのさまざまなタイプの辞書のベクトル0.6

a=Dict(["a"=>"b"]) 
b=Dict(["a"=>3]) 
c=Dict(["a"=>"c"]) 

: 私はこのような何かを持っています。 私は試してみました:

function bbb(a::Vector{Dict{String, Any}}) 
    println(a) 
end 

そして、それは動作しませんでした。

それから私は私が明示的な変換を行うために受け取ることができるすべての組み合わせでBBBオーバーロードしている

function bbb(a::Vector{Dict{String, T} where T}) 
    println(a) 
end 
bbb([a,b]) #Works 
bbb([a,c]) #Fails 
bbb([a,b,c]) #Works 

てみました。しかし、私はまだそれを行う適切な方法がどのようになっているのだろうかと思っています。

答えて

9

これは不変の動作です。パラメータ化には2つのレベルがあるため複雑なケースですが、原則は同じです。

  • Dict{String, Any}キーは文字列であり、値の型が正確にAnyある辞書を説明しています。パラメトリック不変は、Dict{String, Int}ではなく、のサブタイプDict{String, Any}であることを意味します。
  • Dict{String, T} where Tには、すべての辞書が文字列キーで記述されています。 var Tのタイプは、AnyまたはIntを含むどのタイプにも一致します。あなたは辞書のベクトルについて話し始めるとき

は今、同じ原則が適用されます。

  • Vector{Dict{String, T} where T}は、要素型が正確Dict{String, T} where Tであるベクターを記載します。パラメトリック不変は、Vector{Dict{String, Int}}ではなく、のサブタイプVector{Dict{String, T} where T}であることを意味します。
  • Vector{D} where D <: (Dict{String, T} where T)は、要素が文字列キーを持つ辞書であるすべてのベクトルを表します。タイプDは、キーが文字列である辞書タイプ(Dict{String, T} where TまたはDict{String, Int}など)と一致します。

あなたは短縮表記で、単純にこのはるかに表現することができます。これは素晴らしい答えです

function bbb(a::Vector{<: Dict{String, <: Any}}) 
    println(a) 
end 
+0

! –

+0

確かに!ありがとうございました。 –

関連する問題