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

Luc*_*nti 4 dictionary julia

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

a=Dict(["a"=>"b"])
b=Dict(["a"=>3])
c=Dict(["a"=>"c"])
Run Code Online (Sandbox Code Playgroud)

我想要一个接收字典向量而不必进行显式转换的函数.我尝试过:

function bbb(a::Vector{Dict{String, Any}})
     println(a)
end
Run Code Online (Sandbox Code Playgroud)

它没有用.

然后我尝试了

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
Run Code Online (Sandbox Code Playgroud)

为了进行明确的转换,我已经为每个组合重载了bbb.但我仍然想知道如何正确地做到这一点.

Mat*_* B. 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
Run Code Online (Sandbox Code Playgroud)