2017-07-20 60 views
4

我對julia 0.6中的新where語法有些困惑。 我有這樣的事情:茱莉亞不同類型的字典向量0.6

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

我想接收字典的矢量,而無需進行顯式轉換的功能。 我試過:

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

而且它沒有工作。

然後我試圖與

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 

我重載BBB用,我可以爲了做出明確轉換收到的每個組合。但我仍然想知道如何正確地做到這一點。

回答

9

這是行動的不變性。這是一個複雜的情況,因爲有兩個層次的參數化,但原理是一樣的。

  • Dict{String, Any}描述了一個字典,其中的鍵是字符串,值類型正好是Any。參數不變意味着Dict{String, Int}而不是Dict{String, Any}的子類型。
  • Dict{String, T} where T描述了所有帶有字符串鍵的字典。類型變量T可以匹配任何類型,包括AnyInt

現在,當你開始談論字典的載體,同樣的原則也適用:

  • 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)描述了元素是帶有字符串鍵的字典的所有向量。類型var D可以匹配密鑰爲字符串的任何字典類型,包括Dict{String, T} where TDict{String, Int}

您可以用速記符號簡單地表示這更多:

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

這是一個很好的答案! –

+0

確實!謝謝。 –