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

时间:2012-02-28 23:32:23

标签: 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$ 

我用-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_variableseval这样的方法也会导致错误。

1 个答案:

答案 0 :(得分:9)

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

def self.method_missing(sym, *args); @v[sym]; end

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