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]
,然后是通过调用数组创建的第二个数组。因此,它需要更长的时间并使用两倍的内存量。