Julia 朱莉娅的匿名辩论
Julia允许使用未命名参数定义函数和方法 文档中没有提到这一点,文档中也没有明确讨论这一点。例如:Julia 朱莉娅的匿名辩论,julia,Julia,Julia允许使用未命名参数定义函数和方法 文档中没有提到这一点,文档中也没有明确讨论这一点。例如: function myfunc(::Int) println("Hello!") end 我应该如何描述这种行为(我在谷歌上搜索了“匿名参数”但没有成功),它什么时候有用?当您只关心参数类型而不关心参数值时,这种行为对于方法调度很有用。最常见的情况是,您分派的是单例类型 例如: julia> Vector{String}(undef, 3) 3-element Array{Str
function myfunc(::Int)
println("Hello!")
end
我应该如何描述这种行为(我在谷歌上搜索了“匿名参数”但没有成功),它什么时候有用?当您只关心参数类型而不关心参数值时,这种行为对于方法调度很有用。最常见的情况是,您分派的是单例类型 例如:
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中另一种常见的单例类型是缺失
。以下是标准函数的基本定义示例,这些函数将缺少作为参数:
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
(再次-您可以看到,我们并不关心变量的值-我们知道它的类型是缺失
,因此我们返回缺失
)
在Julia手册中,您有此类方法的示例,例如,但无可否认,据我所知,手册没有给出这种方法定义的名称。即使在基本库中,也不总是使用该功能。例如,数字的长度是用length(x::number)=1定义的,其中变量x
没有使用。我在谷歌搜索了“匿名参数”,发现了这个问题