我有一个函数,它接受 7 个(关键字)参数,每个参数都指定了其类型,最后一个具有默认值,如下所示:
function dummy(;truefalse1::S, somevar1::T, somevar2::T, somevar3::T, somevar4::T,
scalarvar::Int64, truefalse2::D = falses(3, 3)) where {
T <: Union{Array{Float64,2}, SubArray{Float64, 2}},
S <: AbstractArray{Bool}, D <: AbstractArray{Bool}}
###
end
Run Code Online (Sandbox Code Playgroud)
所述truefalse*参数可以是2维布尔阵列(BitArray {2})或它的视图(例如view(somearray, 2:4, 3:5))。所述somevar*参数可以是类型Float64或“的2维阵列view”的这样的阵列。
以上工作,但这个看似等效的版本不(见下面的测试输入):
function dummy(;truefalse1::S, somevar1::T, somevar2::T, somevar3::T, somevar4::T,
scalarvar::Int64, truefalse2::S = falses(3, 3)) where {
T <: Union{Array{Float64,2}, SubArray{Float64, 2}},
S <: AbstractArray{Bool}}
###
end
Run Code Online (Sandbox Code Playgroud)
(换句话说,该D类型已被删除,在S两次出现时都使用该类型。)
错误信息如下:
ERROR: MethodError: no method matching #dummy#823(::SubArray{Bool,2,BitArray{2},Tuple{UnitRange{Int64},UnitRange{Int64}},false}, ::SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false}, ::SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false}, ::SubArray{Float64,2,Array{Float64,2},Tuple{UnitRange{Int64},UnitRange{Int64}},false}, …Run Code Online (Sandbox Code Playgroud)