i = 50
function test()
i = 10
eval(:i)
end
test() # => 50
Run Code Online (Sandbox Code Playgroud)
为什么这会评估全局i而不是本地?有没有办法让它评估到当地?
你不能.Julia eval总是评估代码当前模块的范围,而不是本地范围.eval在运行时调用是一种反模式和性能杀手.
正如@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
Run Code Online (Sandbox Code Playgroud)
但是我在运行时评估表达式的首选方法是创建一个函数,我认为这是最有效的:
exprtoeval=:(x*x)
@eval f(x)=$exprtoeval
f(4) # => 16
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |