i = 50
function test()
i = 10
eval(:i)
end
test() # => 50
为什么这会评估全局i
而不是本地{{1}}?有没有办法让它评估到当地?
答案 0 :(得分:6)
你不能。 Julia的eval
总是评估代码当前模块的范围,而不是本地范围。在运行时调用eval
是反模式和性能杀手。
答案 1 :(得分:2)
正如@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
答案 2 :(得分:1)
根据应用程序的不同,您可以eval
整个函数获取i
的本地值,例如this answer中@simonster描述的内容。
答案 3 :(得分:0)
带有嵌套宏的替代解决方案:
macro _localeval(ex)
esc(:($ex))
end
macro localeval(ex)
esc(@_localeval(Meta.parse(ex)))
end
i = 50
function test()
i = 10
@localeval "i"
end
test()