小编Dr.*_*ebe的帖子

Julia:为什么在函数中指定参数类型会导致(看似)不一致的行为?

我有一个函数,它接受 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)

default-value type-declaration julia

1
推荐指数
1
解决办法
162
查看次数

标签 统计

default-value ×1

julia ×1

type-declaration ×1