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

tomanderson · September 17, 2019 · Last by sevk replied at September 19, 2019 · 3196 hits

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
You need to Sign in before reply, if you don't have an account, please Sign up first.