How can I eval a local variable in Julia

2019-01-24 09:31发布

问题:

i = 50
function test()
  i = 10
  eval(:i)
end
test()  # => 50

Why does this evaluate to the global i instead of the local one? Is there a way to make it evaluate to the local?

回答1:

You can't. Julia's eval always evaluates code the current module's scope, not your local scope. Calling eval at run time is an anti-pattern and a performance killer.



回答2:

As @StefanKarpinski mentioned eval always evaluates in global scope, but if one really wants to evaluate something locally, there are various way to do it:

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

But my preferred method to evaluates an expression at run-time is to create a function, I think it's the most efficient:

exprtoeval=:(x*x)
@eval f(x)=$exprtoeval
f(4) # => 16


回答3:

Depending on the application, you could eval the entire function to get at the local value of i such as @simonster describes in this answer.



标签: julia-lang