2017-10-08 61 views
0

全新朱莉娅矢量/阵列的类型 - 所以我的简单的问题道歉,简直似乎无法找到任何地方的答案:指定包含任意数量

我想创建一个函数,它接受一个矢量作为参数,但强制该矢量包含数字(浮点数或整数)。

我觉得这应该写成:

function foo(x::Vector{Number}) 
    return x.^2 
end 

但运行此与foo([5.0])产生

ERROR: MethodError: no method matching foo(::Array{Float64,1}) 
Closest candidates are: 
    foo(::Array{Number,1}) at REPL[16]:2 

这是为什么?我不想诉诸于x::Vector,这将工作,但不提供我想要的类型检查执行。

+0

DNF的答案是正确的,但是请注意,除非您有其他充足的理由,否则最好将'AbstractVector'用于函数参数类型,而不是'Vector'。例如,答案中的代码将在'foo(1:4)'上失败。 –

回答

3

你可以写

function foo(x::Vector{T}) where {T<:Number} 
    return x.^2 
end 

这样做的一个速记符号是

function foo(x::Vector{<:Number}) 
    return x.^2 
end 

编辑:基于由@Liso和@MichaelKBorregaard我建议以下,这不允许Complex和允许发表评论AbstractVector s:

function foo(x::AbstractVector{<:Real}) 
    return x.^2 
end 

如果你真的要允许花车和整数,你可以这样做:

function foo(x::AbstractVector{<:Union{AbstractFloat, Integer}}) 
    return x.^2 
end 

你可以得到非常具体或一般的,只要你喜欢。

+1

如果OP只想支持浮点数和整数(例如不是“Complex”),那么最好用'Real'来替换'Number' – Liso