为什么我从irb 1.9.3中的method_missing得到"堆栈级太深"?

Kel*_*vin 3 ruby irb method-missing

场景:

-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$ 
Run Code Online (Sandbox Code Playgroud)

我用-f运行以避免加载任何irbrc的东西.当我输入时,我期待得到零a.发生了什么,是否有解决方法?我尝试abegin/ rescue Exceptionblock 包装,但没有做任何事情.

这也发生在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$ 
Run Code Online (Sandbox Code Playgroud)

这告诉我irb中存在一个错误,或者irb触发了红宝石中一些模糊的错误.此外,在定义method_missing之后,甚至存在类似local_variableseval导致错误的方法.

Kel*_*vin 9

看起来像将其定义为单例方法一样有效:

def self.method_missing(sym, *args); @v[sym]; end
Run Code Online (Sandbox Code Playgroud)

将它定义为顶级方法取代了BasicObject#method_missing,这可能会影响一些irb内部,如Phrogz所说.