Julia 允许使用未命名参数定义函数和方法。
functions中没有提到这一点文档,methods 中也没有明确讨论文档。例如:
function myfunc(::Int)
println("Hello!")
end
我应该如何描述这种行为(我用谷歌搜索了“匿名参数”但没有成功),它什么时候有用?
最佳答案
当您只关心参数类型而不是参数值时,此行为对于方法分派(dispatch)很有用。最常见的情况是当您分派(dispatch)的是单例类型时。
一个例子是:
julia> Vector{String}(undef, 3)
3-element Array{String,1}:
#undef
#undef
#undef
该函数的定义方式如下:
Array{T,1}(::UndefInitializer, m::Int) where {T} =
ccall(:jl_alloc_array_1d, Array{T,1}, (Any, Int), Array{T,1}, m)
你可以看到我们只关心第一个参数是 UndefInitializer
类型,它又定义为:
struct UndefInitializer end
const undef = UndefInitializer()
我们看到UndefInitializer
是一个单例类型,因此我们不关心该类型变量的值,而只关心它的类型。
Base 中另一个常见的单例类型是 Missing
。以下是来自标准函数 Base 的示例定义,以 Missing
作为参数:
for f in (:(acos), :(acosh), :(asin), :(asinh), :(atan), :(atanh),
:(sin), :(sinh), :(cos), :(cosh), :(tan), :(tanh),
:(exp), :(exp2), :(expm1), :(log), :(log10), :(log1p),
:(log2), :(exponent), :(sqrt))
@eval $(f)(::Missing) = missing
end
(同样,您可以看到我们并不关心变量的值 - 我们知道它的类型是 Missing
,因此我们返回 missing
)
在 Julia 手册中,您有此类方法的示例,例如here但不可否认的是,据我所知,手册没有给出这种风格的方法定义的名称。
关于julia - Julia 的匿名争论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57480771/