我正在尝试定义一个将字符串作为键和任何值的字典。因此,我尝试使用Dict{String, <:Any}
作为类型。但是,该表达式的返回值为
> Dict{String,#s27} where #s27
此外,如果我尝试定义该类型的字典,则会出现错误:
Dict{String,<:Any}()
,我得到ERROR: MethodError: no method matching Dict{String,#s28} where #s28()
Dict{String,<:Any}("aa"=>42)
,我得到ERROR: MethodError: no method matching Dict{String,#s29} where #s29(::Pair{String,Int64})
我也尝试使用
Dict{String}
(应该等效),结果相似。我对这里的字典类型缺少什么?
最佳答案
您要查找的是Dict{String, Any}
,而不是Dict{String, <:Any}
。第一个是具体类型,即一种将字符串作为键并将任何内容作为值的字典。第二个Dict{String, <:Any}
实际上不是具体类型,而是unionall类型。这意味着它是一组无限的类型。您看到的错误是您无法实例化这组类型。您只能实例化一个具体的(叶子)类型。
编写Dict{String, <:Any}
的另一种方法是Dict{String, T} where T <: Any
,这使它更加清晰。它是所有类型的Dict
的集合,其键类型为String
,而类型为Any
的子类型作为其值类型。
因此,例如,我们可以说Dict{String, Int}
是无限集Dict{String, <:Any}
的子类型。
编辑:unionall类型的一种用法是能够将您采用的类型限制为细粒度的级别。例如,计数功能可能如下所示:
function count_stuff(stuff, counter::Dict{T, <:Integer}) where T
# stuff here¨
end
这里的第二个参数是
Dict
,它具有Integer
的某些子类型作为值类型,而任何类型都作为键类型。基本上这就是您需要使用dict作为计数器的内容。