Джулия получить значение параметров типа - PullRequest
3 голосов
/ 05 мая 2020

У меня параметр типа c. Например:

> Array([1 2;3 4])

Его тип

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

Array{Int64,2}

Я могу получить параметр первого типа, используя eltype:

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

Int64

Как мне получить доступ ко второму и, возможно, другие параметры типа?

Ответы [ 2 ]

3 голосов
/ 05 мая 2020

Если вы говорите конкретно о типах (Abstract)Array, то измерение можно получить, используя ndims:

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

Если, с другой стороны, вы хотите написать настраиваемую функцию, которая извлекает данный параметр из типа c параметров, вы можете использовать сборку следующим образом:

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 здесь для примера, но такая же конструкция может использоваться для извлечения параметров из любого другого параметра c типа)

2 голосов
/ 05 мая 2020

То, что рекомендует Франсуа Февот, является лучшим и самым безопасным. Однако, если вы хотите покопаться во внутренностях (опять же - я бы не рекомендовал это в производственном коде, но иногда это полезно), вы можете написать:

get_parameters(x::DataType) = collect(x.parameters)

Теперь вы можете получить вектор параметров из x для любого типа, который равен DataType:

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 может быть любым DataType.

...