使用可以包含多个类型的参数定义函数的最佳方法是什么?
例如Float64
或Array{Float64}
/ Array{Float64,2}
或SparseMatrixCSC{Float64}
我们说我定义了以下功能:
function meanValue(a::Array{Float64})
return mean(a)
end
如何在没有复制粘贴原始函数内容的情况下为标量值或稀疏向量的情况定义函数? 谢谢!
答案 0 :(得分:2)
在这种情况下,您可以使用Union
,例如
julia> f(x::Union{Float64, Int}) = typeof(x)
f (generic function with 1 method)
julia> f(1)
Int64
julia> f(1.0)
Float64
julia> f(true)
ERROR: MethodError: no method matching f(::Bool)
Closest candidates are:
f(::Union{Float64, Int64}) at REPL[1]:1
这种方法的一个很好的例子是Base.Chars
:
julia> Base.Chars
Union{AbstractArray{Char,1}, Char, Set{Char}, Tuple{Vararg{Char,N} where N}}
用于例如在strip
函数中。
但是,在许多情况下,不指定接受的类型就可以了,例如:
f(x) = typeof(x)
这没有性能损失,并且有一个好处,如果将来你想在最初没有想到的类型上使用该函数,你不必重新定义它(甚至可能没有定义类型)当函数被定义时。)
当然,有些情况下你想指定接受的类型 - 那么你可以:
Union
; 答案 1 :(得分:1)
您可以尝试通用,而不是在函数签名中列出很多类型。你想要各种数组和各种数字的手段吗?然后,也许试试
function meanvalue(a::AbstractArray{<:Number})
return mean(a)
end
然后你想用标量输入捕获这些情况:
meanvalue(x::Number) = x
现在,您已经涵盖了大多数可能性,至少涉及数组。