我正在尝试定义一个将字符串作为键和任何值的字典。因此,我尝试使用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作为计数器的内容。

    09-09 22:17
    查看更多