Rails Rails 中 eval 执行变量赋值的问题,binding 相关

tomanderson · 2019年09月17日 · 最后由 sevk 回复于 2019年09月19日 · 3196 次阅读

rails 写一个简单函数:

def test
  eval("a=1")
  return a
end

以为会返回 1,但实际报错变量 a undefined

如果是 irb 中,这个问题可以用绑定作用域的方法解决:

eval("a=1"), IRB.conf[:MAIN_CONTEXT].workspace.binding

请教各位,在 rails 中如何解决呢?

一些情况下,可以使用实例变量来代替局部变量

def test
  eval "@a = 1"
  @a
end

如果必须用局部变量,有办法吗

def test
  a = nil
  eval("a=1")
  a 
end

输出

pry(main)> test
=> 1

方法体一开始就编译了的缘故,irb 可以不是因为 binding,而是因为对 b 的调用还没编译,但是在 def 里 b 还不知道有局部变量的时候就编译成 method call 了。综上所述,可以用 method missing,或者无解

用全局变量 $a 
或者类变量 @@a
或实例变量 @a
需要 登录 后方可回复, 如果你还没有账号请 注册新账号