можно ввести новые переменные в глобальной рамки с eval
:
julia> x = 1
1
julia> function testeval()
eval(:(x = 5))
return x
end
testeval (generic function with 1 method)
julia> testeval()
5
julia> x # the global x has changed!
5
extract
функция может выглядеть следующим образом:
julia> function extract(d)
expr = quote end
for (k, v) in d
push!(expr.args, :($(Symbol(k)) = $v))
end
eval(expr)
return
end
julia> extract(d)
julia> key1, key2, key3
(111,222,333)
Обратите внимание, что каждый модуль имеет свой собственный глобальный охват. Следовательно, это будет вводить переменные в объем модуля, где определена функция extract
, то есть в модуль Main
, если он определен в REPL, как в примере.
Вы должны быть очень осторожны при использовании eval
и сначала рассмотреть другие подходы, например, упомянутые Дэвидом П. Сандерсом и Дэном Гетцем.
Посмотрите на пакет mauro3 Parameters.jl (https://github.com/mauro3/Parameters.jl). В частности, распаковка Dict - это способ описания этой операции. –