julia - Julia 的匿名争论

标签 julia

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/

相关文章:

Julia 切片边界检查不一致

multiprocessing - 如何从包远程运行 Julia 函数?

arrays - Julia 中用户定义的类型用于 "marking"目的

julia - 识别子文件夹中的文件夹

dataframe - 如何在 Julia Dataframes 中用缺失值替换虚拟值?

c# - 将 Julia 脚本嵌入到 C# : jl_get_function doesn't exist?

function - 问题是我的函数还是我尝试使用的数据集?

julia - Julia 中的函数参数传递和函数重定义

julia - 如何在 Julia 中使用 for 循环定义 JuMP 变量?

julia - 识别稀疏矩阵中哪些行(或列)具有值