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

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

rails写一个简单函数:

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

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

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

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

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

共收到 6 条回复

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

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
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册