2017-10-08 68 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