假设我有一个函数需要一个 dict 作为输入。在此范围内,此函数只能处理特定Union
允许类型中的该 dict 的值。对于此参数,输入可以是Number
、String
或Bool
:
allowed_types = Union{String, Int, AbstractFloat, Bool}
该函数还可以允许其值是这些允许的类型 ( Dict{String,allowed_types}
) 的字典或项目是这些类型 ( ) 的数组,Array{allowed_types,Int}
因为它们可以“反汇编”为这些允许的类型之一。(这可以继续向下 - 所以数组数组等)
full_allowed_types = Union{allowed_types, Dict{String,allowed_types}, Array{allowed_types,Int}}
然后我可以将我的功能定义为
function my_func(input::Dict{String,full_allowed_types})
...
end
那么,我如何构建我的函数参数以便我可以传递,IE my_func(Dict("a"=>"astr","b"=>1))
,?通常,该Dict(...)
调用会导致 a Dict{String,Any}
,它不能与我的函数一起调用,因为Any
它不是允许的类型。
我当前实现的错误是:
my_func(Dict("a"=>"astr","b"=>1))
ERROR: MethodError: no method matching my_func(::Dict{String,Any})
Closest candidates are:
my_func(::Dict{String,Union{Bool, Int64, Dict{String,Union{Bool, Int64, AbstractFloat, String}}, AbstractFloat, Array{Union{Bool, Int64, AbstractFloat, String},Int64}, String}}) at <snip>/my_func.jl:41
Stacktrace:
[1] top-level scope at none:0
我从用户的角度来描绘这个问题,用户可能只是使用默认构造函数创建一个 dict,而不考虑my_func
想要“允许”什么(这意味着我不希望他们调用Dict{String,my_pkg.full_allowed_types}(...)
)。
如果在我遍历输入时任何元素不符合我允许的类型,那么最好的选择是只允许Any
作为输入然后抛出错误吗?my_func