Ric*_*ias 3 arrays types julia
我正在尝试通过阅读文档来学习Julia,他们的代码看起来像这样:
function testFunction(x::Number)
return x+5
end
Run Code Online (Sandbox Code Playgroud)
这是一个适用于Juila中许多数字类型的函数.
但是,如果我尝试做类似的事情,像这样:
function testFunction2(x::Array{Number})
return x
end
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ERROR: MethodError: no method matching testFunction2(::Array{Int64,1})
Closest candidates are:
testFunction2(::Array{Number,N} where N) at /Users/.../Desktop/Test.jl:45
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我想这是:Array{Float64}你是如何声明一个特定类型的数组,但是使用类似的类型Number,它适用于常规情况,在这里不起作用...任何见解都值得赞赏.
定义
function testFunction2(x::Array{Number})
return x
end
Run Code Online (Sandbox Code Playgroud)
是接受输入的识别函数Array{Number}.所以以下内容将起作用:
testFunction2(collect((1,3,-2.7,5+2im)))
但是这将不会工作:
testFunction2([1,3,7,9])
从这里可以看出:
julia> typeof(collect((1,3,-2.7,5+2im)))
Array{Number,1}
julia> typeof([1,3,7,9])
Array{Int64,1}
Run Code Online (Sandbox Code Playgroud)
第一个匹配x您定义的类型,testFunction2第二个不匹配.(注意,这Array{Number}是同义词Array{Number,1}.)
你正在寻找的是一个函数,它接受任何元素类型的数组,这是一个子类型Number.这样做:
function testFunction2(x::Array{T}) where {T<:Number}
return x
end
Run Code Online (Sandbox Code Playgroud)
现在我们有一个参数T,允许任何子类型Number.你也可以使用糖
function testFunction2(x::Array{<:Number})
return x
end
Run Code Online (Sandbox Code Playgroud)
甚至testFunction2(x::Array{<:Number}) = x.
另一个答案是:手册中的示例与您的代码之间的行为有所不同的原因是,在您的情况下,Number它用作另一种类型(Array)中的类型参数。与是否Number将其本身用作类型相比,这将进行更严格的类型检查。就像@StefanKarpinski在此答案中所说的,
(链接已更正为最新链接。)
该手册的重点是:“即使Float64 <:Real,我们也没有Point {Float64} <:Point {Real}”。同样,在你的情况下,即使我们有Int64 <: Number,我们不具备Array{Int64} <: Array{Number},这就是为什么类型匹配失败。
因此,通常,您可以编写x::Number以匹配任何数字类型,也可以编写p::AbstractString以匹配属于的子类型的任何字符串类型AbstractString,等等。但是,如果您将抽象类型用作类型参数作为另一种类型的一部分,则您可以明确指定您希望它与参数类型的所有子类型匹配,即使用Point{<:Real}或Array{<:Number}。