在 Julia 中没有参数但有类型的函数

Function with no arguments but with type in Julia

我最近浏览了一些 Julia 的源代码,发现一些功能对我来说似乎很神秘。

Julia 源代码中定义了一些函数,它们没有参数但有类型注释。

例如:abstractarray.jl

中的第 20 行

我试了一下ndims函数,

似乎 ndims 可以将类型本身作为参数并且 return 正确的值:

julia> ndims(AbstractArray{Float64, 2})
       2
julia> ndims([1.1 0.3; 0. 0.5])
       2

有人可以向我解释 (::DataType) 如何在方法中工作吗? 或者它在 Julia 中是什么意思?

在探索 Julia 中函数的行为时,了解 正在调用哪个 特定 方法 很重要。 Julia 是围绕 multiple dispatch 组织的,因此像 ndims 这样的单个名称可能与不同的实现相关联——由参数的类型选择。要查看 ndims 是如何实现的,我们可以使用 @which 宏来确定为特定调用选择的实现:

julia> @which ndims(AbstractArray{Float64, 2})
ndims{T,n}(::Type{AbstractArray{T,n}}) at abstractarray.jl:61

julia> @which ndims([1.1 0.3; 0. 0.5])
ndims{T,n}(::AbstractArray{T,n}) at abstractarray.jl:60

目前在abstractarray.jl中的实现如下:

ndims{T,n}(::AbstractArray{T,n}) = n
ndims{T,n}(::Type{AbstractArray{T,n}}) = n

两个签名都parametric methods采用参数{T,n}

  • 第一个签名是针对类型为 AbstractArray{T,n} 实例 ——例如,在您的示例中,[1.1 0.3; 0. 0.5](在几个抽象层之下).
  • 第二个签名是针对类型 AbstractArray{T,n}本身。

(两个签名都没有命名参数,尽管它们显然都接受一个参数。因为行为仅取决于参数的类型签名,所以不需要名称)

基本思想在 Julia 手册的 types and methods 部分进行了解释。