i = 50
function test()
i = 10
eval(:i)
end
test() # => 50
Почему это оценивается глобальным i
вместо локального? Есть ли способ заставить его оценить местный?Как можно изменить локальную переменную в Julia
i = 50
function test()
i = 10
eval(:i)
end
test() # => 50
Почему это оценивается глобальным i
вместо локального? Есть ли способ заставить его оценить местный?Как можно изменить локальную переменную в Julia
Вы не можете. Julia's eval
всегда оценивает код области текущего модуля, а не локальную область. Вызов eval
во время выполнения - это анти-шаблон и убийца производительности.
В зависимости от приложения вы могли бы eval
вся функция, чтобы получить локальное значение i
, такое как @simonster, описано в this answer.
Как @StefanKarpinski упоминался eval
всегда оценивает в глобальном масштабе, но если один действительно хочет, чтобы оценить что-то на местном уровне, существует различный способ сделать это:
import Base.Cartesian.lreplace
i = 50
function test1(expr)
i=10
eval(lreplace(expr,:i,i))
end
i = 50
function test2()
i = 10
@eval $i
end
test1(:(i)) # => 10
test2() # => 10
Но мой предпочтительный метод вычисляет выражение в перспективе время - создать функцию, я думаю, что она наиболее эффективна:
exprtoeval=:(x*x)
@eval f(x)=$exprtoeval
f(4) # => 16
try 'local i = 10' –