Julia:函数参数——数组的类型规范

uni*_*eur 2 arrays types arguments julia

似乎我错过了关于多分派 + 参数类型的一些东西:

Integer 是所有整数类型的抽象超类型,因此该方法f(arg::Integer)按预期工作:

f(arg::Integer) = println("an integer")
# f(42) prints "an integer"
# f(UInt8(42)) prints "an integer"
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试将一维整数数组作为参数类型进行相同操作,则 julia 会回答一条错误消息:

f(arg::Array{Integer, 1}) = println("an array with integers")
f(arg::Array{Signed, 1}) = println("an array with signed integers")
# f([1,2,3]) gives "no method matching f(::Array{Int64,1})..."
Run Code Online (Sandbox Code Playgroud)

知道这里有什么问题吗?- 提前致谢!

Nil*_*dat 5

您遇到了参数类型不变性,即此处的手册中漂亮的橙色警告框。

引用相关部分:

具有不同 T 值的具体点类型永远不会是彼此的子类型:

julia> Point{Float64} <: Point{Int64}
false

julia> Point{Float64} <: Point{Real}
false
Run Code Online (Sandbox Code Playgroud)

警告

最后一点非常重要:即使 Float64 <: Real 我们也没有 Point{Float64} <: Point{Real}。

对于您的示例,您需要:

f(arg::Array{<:Integer, 1}) = println("an array with integers")
# Alternatively f(arg::Array{T, 1}) where T <: Integer = println("an array with integers")
f(arg::Array{Signed, 1}) = println("an array with signed integers")
Run Code Online (Sandbox Code Playgroud)

第一种方法是通用整数数组的后备方法,第二种方法可以使用特定类型调用Array{Signed, 1}

julia> f([1,2,3])
an array with integers

julia> f(Array{UInt8, 1}([1,2,3]))
an array with integers

julia> f(Array{Signed, 1}([1,2,3]))
an array with signed integers
Run Code Online (Sandbox Code Playgroud)