目标是定义一个函数,该函数接受一个方法和一个类型的元组,并返回 true 这些类型是该方法的有效输入。没有功能,method
accepts(meth::Method, types::Tuple)::Bool
这是一个测试集
using Base.Test
@testset "accepts method checker" begin
concrete = first(methods(length, (String,)))
#length(s::String) in Base at strings/string.jl:162
abstract_ = last(collect(methods(length,(AbstractArray,))))
#length(t::AbstractArray) in Base at abstractarray.jl:131
triangular = first(methods(length, (StepRange,)))
# length(r::StepRange{T,S} where S) where T<:Union{Int64, UInt64} in Base at range.jl:381
a = "hello"
a_t = (typeof(a),) #(String,)
@test accepts(concrete, a_t)
@test !accepts(abstract_, a_t)
@test !accepts(triangular, a_t)
b = 1.5:10
b_t = (typeof(b),) #(StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}})
@test !accepts(concrete, b_t)
@test accepts(abstract_, b_t)
@test !accepts(triangular, b_t)
c_t = (StepRange{Float64, Float64},) # Nothing real has this type as it can't be constructed
@test !accepts(concrete, c_t)
@test accepts(abstract_, c_t)
@test !accepts(triangular, c_t)
d = 1:2:10
d_t = (typeof(d),) #(StepRange{Int64,Int64}
@test !accepts(concrete, d_t)
@test accepts(abstract_, d_t)
@test accepts(triangular, d_t)
end
由于 julia 没有太多的公共反射 API(正如我之前所抱怨的那样),我对可能会破坏每个补丁版本的代码感到满意
这个问题的目的是帮助我了解将InterfaceTesting.jl 的这一部分从 0.5 更新到 0.6需要做什么
使我的旧代码不再工作的事情是为了允许三角调度而引入的更改。所以triangular
考试是最难通过的。