我对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。但我仍然想知道如何正确地做到这一点。
答案 0 :(得分:10)
这是行动中的不变性。这是一个复杂的案例,因为有两个级别的参数化,但原理是相同的。
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)
描述了元素是带字符串键的字典的所有向量。类型var D
可以匹配键是字符串的任何字典类型,包括Dict{String, T} where T
或Dict{String, Int}
。您可以使用简写符号更简单地表达这一点:
function bbb(a::Vector{<: Dict{String, <: Any}})
println(a)
end