有人可以帮助我理解为什么这个julia函数定义与我在下面看到的使用它的尝试并不匹配吗?
我天真的假设是,传递给函数的Array{ASCIIString,1}
应该与Array{AbstractString,1}
的函数定义匹配,依此类推。
julia> function test(a::Array{AbstractString,1}, b::AbstractString, c::Any) end
test (generic function with 1 method)
julia> test([""],"","")
ERROR: MethodError: `test` has no method matching test(::Array{ASCIIString,1}, ::ASCIIString, ::ASCIIString)
Closest candidates are:
test(::Array{AbstractString,1}, ::AbstractString, ::Any)
julia>
答案 0 :(得分:5)
我认为值得将上述两条评论转化为答案。
正如@DanGetz所指出的,这里的重要短语是不变。在这种特殊情况下,此原则意味着ASCIIString <: AbstractString
评估为true
,但Array{ASCIIString, 1} <: Array{AbstractString, 1}
评估为false
。因此,对于您的问题中定义的函数,您需要将a
数组eltype(a)
传递给AbstractString
。通过a
评估eltype(a)
传递ASCIIString
不起作用,因为这不是Array{AbstractString, 1}
的子类型。
要解决您的问题,您需要输入类型参数。如果您只想为b
的类型匹配eltype(a)
的情况定义函数,那么您将使用:
function test{T<:AbstractString}(a::Array{T}, b::T, c::Any)
如果您希望b
的类型与eltype(a)
不同,但强制b
为AbstractString
的子类型,则可以使用:
function test{T<:AbstractString}(a::Array{T}, b::AbstractString, c::Any)
答案 1 :(得分:1)
自Colin回答以来,Julia的语法发生了变化。从Julia版本1开始,它看起来像这样:
function test(a::Array{T}, b::T, c::Any) where {T<:AbstractString}
请参阅:https://docs.julialang.org/en/v1/manual/methods/#Methods-1