Types 获取类型参数的值

Types 获取类型参数的值,types,julia,Types,Julia,我有一个参数类型。例如: > Array([1 2;3 4]) 它的类型是 > typeof(Array([1 2;3 4])) Array{Int64,2} 我可以使用eltype获取第一个类型参数: > eltype(typeof(Array([1 2;3 4]))) Int64 julia> get_parameters(Vector{Int}) 2-element Array{Any,1}: Int64 1 julia> get_param

我有一个参数类型。例如:

> Array([1 2;3 4])
它的类型是

> typeof(Array([1 2;3 4]))

Array{Int64,2}
我可以使用
eltype
获取第一个类型参数:

> eltype(typeof(Array([1 2;3 4])))

Int64
julia> get_parameters(Vector{Int})
2-element Array{Any,1}:
  Int64
 1

julia> get_parameters(Int)
0-element Array{Any,1}

julia> get_parameters(Dict{Int, Union{String, Missing}})
2-element Array{Any,1}:
 Int64
 Union{Missing, String}

如何访问第二个类型参数以及可能的其他类型参数?

如果您特别提到
(抽象)数组类型,则可以使用以下方法检索维度:


另一方面,如果要编写从参数化类型中提取给定参数的自定义函数,可以使用如下生成函数:

julia> second_param(::Type{Array{T, N}}) where {T, N} = N
second_param (generic function with 1 method)

julia> second_param(Array{Int64, 2})
2

(为了这个例子,我在这里使用了
Array
,但同样的构造也可以用于从任何其他参数类型中提取参数)

弗朗索瓦·费沃特(François Févotte)推荐的方法是最好和最安全的。但是,如果您想深入研究内部(同样-我不建议在生产代码中使用它,但有时它很有用),那么您可以编写:

get_parameters(x::DataType) = collect(x.parameters)
现在,您可以为数据类型为
的任何类型获得
x
的参数向量:

> eltype(typeof(Array([1 2;3 4])))

Int64
julia> get_parameters(Vector{Int})
2-element Array{Any,1}:
  Int64
 1

julia> get_parameters(Int)
0-element Array{Any,1}

julia> get_parameters(Dict{Int, Union{String, Missing}})
2-element Array{Any,1}:
 Int64
 Union{Missing, String}

这里的好处是,您传递的
x
可以是任何
数据类型

您不必编写eltype(typeof(Array([12;34])),只需eltype([12;34])即可。要构造数组,只需使用括号:[1,2,3],无需将其包装在构造函数中。当您编写
数组([12;34])
时,实际上是在创建两个数组:首先是
[12;34]
,然后是通过调用
数组创建的第二个数组。因此,它需要更长的时间并使用两倍的内存量。