不同的类型字典传染媒介在朱莉娅0.6

时间:2017-07-20 15:40:51

标签: dictionary julia

我对julia 0.6中的新where语法感到有点困惑。 我有这样的事情:

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。但我仍然想知道如何正确地做到这一点。

1 个答案:

答案 0 :(得分:10)

这是行动中的不变性。这是一个复杂的案例,因为有两个级别的参数化,但原理是相同的。

  • Dict{String, Any}描述了一个字典,其中键是字符串,值类型正好是Any。参数不变性意味着Dict{String, Int} Dict{String, Any}的子类型。
  • Dict{String, T} where T描述了所有带字符串键的字典。 var 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