在 Julia 中没有参数但有类型的函数
Function with no arguments but with type in Julia
我最近浏览了一些 Julia 的源代码,发现一些功能对我来说似乎很神秘。
Julia 源代码中定义了一些函数,它们没有参数但有类型注释。
中的第 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 的源代码,发现一些功能对我来说似乎很神秘。
Julia 源代码中定义了一些函数,它们没有参数但有类型注释。
中的第 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}
本身。
(两个签名都没有命名参数,尽管它们显然都接受一个参数。因为行为仅取决于参数的类型签名,所以不需要名称)