rails 写一个简单函数:
def test eval("a=1") return a end
以为会返回 1,但实际报错变量 a undefined。
a undefined
如果是 irb 中,这个问题可以用绑定作用域的方法解决:
eval("a=1"), IRB.conf[:MAIN_CONTEXT].workspace.binding
请教各位,在 rails 中如何解决呢?
一些情况下,可以使用实例变量来代替局部变量
def test eval "@a = 1" @a end
如果必须用局部变量,有办法吗
https://ruby-china.org/topics/28506
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