情景:
-bash-3.2$ irb -f
ruby-1.9.3-p0 :001 > @v = {}
=> {}
ruby-1.9.3-p0 :002 > def method_missing(sym, *args); @v[sym]; end
=> nil
ruby-1.9.3-p0 :003 > a
(irb):2: stack level too deep (SystemStackError)
-bash-3.2$
我用-f运行以避免加载任何irbrc的东西。
当我输入a
时,我期待得到零。发生了什么,是否有解决方法?我尝试用a
/ begin
块封装rescue Exception
,但没有做任何事情。
这也适用于1.9.2,但不是1.9.1。
更奇怪的行为:
-bash-3.2$ irb -f
irb(main):001:0> @v = {}
=> {}
irb(main):002:0> def method_missing(sym, *args); @v[sym]; end; 5.times { p a }
nil
nil
nil
nil
nil
=> 5
irb(main):003:0> a
(irb):2: stack level too deep (SystemStackError)
-bash-3.2$
这告诉我irb中存在一个错误,或者ruby中的一些晦涩的bug被irb触发。此外,在定义method_missing之后,即使像local_variables
或eval
这样的方法也会导致错误。
答案 0 :(得分:9)
看起来将其定义为单例方法有效:
def self.method_missing(sym, *args); @v[sym]; end
将它定义为顶级方法取代了BasicObject#method_missing,这可能会影响像Phrogz所说的一些irb内部结构。