Julia 为具有多种可能类型的参数定义函数
使用可以有多种类型的参数定义函数的最佳方法是什么? e、 g.Julia 为具有多种可能类型的参数定义函数,julia,Julia,使用可以有多种类型的参数定义函数的最佳方法是什么? e、 g.Float64或Array{Float64}/Array{Float64,2}或SparseMatrixCSC{Float64} 假设我定义了以下函数: function meanValue(a::Array{Float64}) return mean(a) end 如何在不复制粘贴原始函数内容的情况下为标量值或稀疏向量定义函数? 谢谢大家! 在这种情况下,您可以使用联合,例如 julia> f(x::Union{Floa
Float64
或Array{Float64}
/Array{Float64,2}
或SparseMatrixCSC{Float64}
假设我定义了以下函数:
function meanValue(a::Array{Float64})
return mean(a)
end
如何在不复制粘贴原始函数内容的情况下为标量值或稀疏向量定义函数?
谢谢大家! 在这种情况下,您可以使用
联合
,例如
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
,例如:
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)
这不会对性能造成任何损失,并且有一个好处,即如果将来您希望在最初没有想到的类型上使用函数,则不必重新定义它(甚至可能在定义函数时没有定义该类型)
当然,在某些情况下,您需要指定接受的类型-然后您可以:
联合
李>
不必在函数签名中列出很多类型,您可以尝试使用通用的方法。你想要各种数组和各种数字的平均值吗?那么,也许试试看
function meanvalue(a::AbstractArray{<:Number})
return mean(a)
end
现在,您已经讨论了大多数可能性,至少是关于数组的可能性。不要在函数签名中列出许多类型,您可以尝试使用一般性的方法。你想要各种数组和各种数字的平均值吗?那么,也许试试看
function meanvalue(a::AbstractArray{<:Number})
return mean(a)
end
现在,您已经讨论了大多数可能性,至少涉及数组。可能值得明确提及
Union{AbstractArray{Float64},Float64}
,即涵盖OP提到的类型的Union。可能值得明确提及Union{AbstractArray{Float64},Float64}
,也就是说,包含OP.Julia提到的类型的union自动专门处理给定的类型,因此没有类型参数的meanValue(a)
不会有性能损失。它们使用起来非常好,但请注意,这是为了安全,而不是为了速度。在许多情况下,不添加参数(称为duck类型)是首选。看,这澄清了很多。我假设指定类型将提高速度!Julia自动专门处理给定的类型,因此没有类型参数的meanValue(a)
将不会受到性能损失。它们使用起来非常好,但请注意,这是为了安全,而不是为了速度。在许多情况下,不添加参数(称为duck类型)是首选。看,这澄清了很多。我假设指定类型将提高速度!