Предположим, что я пишу функцию в Julia, которая принимает в качестве аргумента Dict{K,V}
, а затем создает массивы типа Array{K,1}
и Array{V,1}
. Как я могу извлечь типы K
и V
из объекта Dict, чтобы я мог использовать их для создания массивов?Извлечение типов параметров в Julia
ответ
Ответы Свена и Джона оба совершенно правильные. Если вы не хотите, чтобы ввести параметры типа метода, как код Джона делает, вы можете использовать eltype
функции:
julia> d = ["foo"=>1, "bar"=>2]
["foo"=>1,"bar"=>2]
julia> eltype(d)
(ASCIIString,Int64)
julia> eltype(d)[1]
ASCIIString (constructor with 1 method)
julia> eltype(d)[2]
Int64
julia> eltype(keys(d))
ASCIIString (constructor with 1 method)
julia> eltype(values(d))
Int64
Как вы можете видеть, есть несколько способов кожи этого кота, но я думаю, что eltype(keys(d))
и eltype(values(d))
являются на сегодняшний день самыми ясными, и поскольку функции keys
и values
просто возвращают неизменные объекты вида, компилятор достаточно умен, что фактически не создает никаких объектов.
Вы можете использовать keys
и values
в сочетании с typeof
:
# an example Dict{K, V}
d = Dict{Int64, ASCIIString}()
# K
typeof(keys(d))
Array{Int64,1}
# V
typeof(values(d))
Array{ASCIIString,1}
Возможно, стоит отметить, что 'keys' и' values' теперь возвращают итераторы, а не массивы. Вам нужно добавить вызов «собирать» в новых версиях Julia, чтобы получить массив. –
Если вы пишете функцию, которая будет делать это для вас, вы можете сделать типы параметр функции, который может сохранить вы некоторое время просматриваете:
julia> function foo{K, V}(d::Dict{K, V}, n::Integer = 0)
keyarray = Array(K, n)
valarray = Array(V, n)
# MAGIC HAPPENS
return keyarray, valarray
end
foo (generic function with 2 methods)
julia> x, y = foo(["a" => 2, "b" => 3])
([],[])
julia> typeof(x)
Array{ASCIIString,1}
julia> typeof(y)
Array{Int64,1}
Если вы просто заинтересованы в типах, вы можете использовать eltype(d)
, или определить еще более конкретные функции
keytype{K}(d::Dict{K}) = K
valuetype{K,V}(d::Dict{K,V}) = V
и найти тип сразу через
keytype(d)
valuetype(d)
Насколько я понимаю, это должно быть довольно эффективно, потому что компилятор может вывести большую часть этого во время компиляции.
- 1. Подтипы конкретных типов Julia
- 2. Julia: Эффективность нескольких параметров
- 3. Julia: Создание параллельных параллельных типов
- 4. Использование массива абстрактных типов в Julia
- 5. Принцип двоичного представления типов данных в Julia
- 6. Построение типов со связанными полями в Julia
- 7. Создание просмотров пользовательских типов в julia
- 8. Понимание неизменяемых композитных типов с полями изменяемых типов в Julia
- 9. Несколько типов параметров в классе типов?
- 10. Как передать список параметров функции в Julia
- 11. Выражения в зависимости от параметров целочисленных типов в определениях типа в Julia не допускается
- 12. Извлечение полиморфных типов в json4s
- 13. Извлечение архивов нескольких типов
- 14. Извлечение общих типов аргументов
- 15. Извлечение параметров записи из TProgramInfo в DWScript
- 16. Как получить глубокие копии композитных типов Julia?
- 17. Проверка типов параметров в Rails
- 18. PowerShell типов параметров функции
- 19. JavaScript типов параметров конструктора
- 20. Jmeter извлечение параметров
- 21. Извлечение параметров шаблона size_t
- 22. Извлечение параметров из рельсов
- 23. Извлечение идентификаторов из параметров
- 24. извлечение параметров из строки
- 25. Преимущества типов функций в качестве типов параметров в swift?
- 26. Regex email (несколько типов) извлечение
- 27. Кортежи неизвестного размера/типов параметров
- 28. Элегантная обработка различных типов параметров
- 29. Преобразование типов для параметров NSRect
- 30. Извлечение типов ошибок в глубину xml
Спасибо всем. Я решил принять этот ответ, потому что он был наиболее общим (также будет работать и с другими итерабельными структурами данных). –
'eltype (d)' now возвращает 'Pair {ASCIIString, Int64}' и 'eltype (d) [1]' больше не работает. (Julia v0.4) – colinfang
'keytype' и' valtype' являются встроенными с v0.4 и заменяются соответственно 'eltype (d) [1]' и 'eltype (d) [2]', соответственно , –