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

Dbo*_*iao 4 methods types function julia

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

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

例如:abstractarray.jl中的第20行

我尝试了一下这个ndims功能,

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

julia> ndims(AbstractArray{Float64, 2})
       2
julia> ndims([1.1 0.3; 0. 0.5])
       2
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下(::DataType)方法的工作原理吗?或者朱莉娅的意思是什么?

Isa*_*ton 12

在Julia中探索函数的行为时,了解调用哪种特定方法很重要.Julia是围绕多个调度组织的,因此单个名称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
Run Code Online (Sandbox Code Playgroud)

目前的实现abstractarray.jl如下:

ndims{T,n}(::AbstractArray{T,n}) = n
ndims{T,n}(::Type{AbstractArray{T,n}}) = n
Run Code Online (Sandbox Code Playgroud)

这两个签名是参数方法采取的参数{T,n}.

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

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

Julia手册的类型方法部分解释了基本思想.

  • 没有区别 - 第二个版本仍然接受一个参数,它只是未命名.这是有效的,因为该函数完全依赖于参数化.在某种意义上,`{T,n}`也是"参数",但在类型系统的层面上.如果您需要使用`arr`实际执行某些操作,那么参数必须在您的第一个版本中命名. (3认同)