Ruby 为什么我会得到;“堆栈级别太深”;irb 1.9.3中缺少方法_?

Ruby 为什么我会得到;“堆栈级别太深”;irb 1.9.3中缺少方法_?,ruby,irb,method-missing,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运行以避免加载任何ir

情景:

-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
时,我希望得到零。发生了什么,有解决办法吗?我尝试用一个
begin
/
rescue Exception
块包装
a
,但没有任何效果

这在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中有一个bug,或者ruby中的一些模糊bug是由irb触发的。此外,在定义方法\u缺失后,即使是存在的方法,如
局部\u变量
eval
也会导致错误。

看起来将其定义为单例方法是可行的:

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

将其定义为顶级方法将取代BasicObject#method(u missing),这可能会影响某些irb内部,如Phrogz所说。

我在irb下发现了各种错误,通过定义
method(u missing
),这些错误不会发生在irb之外。例如:
irb>def方法_缺失(*a);通讯社结束;=>无[:to_hash];[:to_str];C:/Ruby/lib/Ruby/site_Ruby/1.9.1/readline.rb:45:in-raise:无法将TypeError转换为字符串(TypeError#to_str给出数组)(TypeError)
随机猜测(不是答案):irb依赖于现有的monkeypatch并将其转换为
方法_missing
,重新定义它会把事情搞砸。看起来有点模糊的关联。@Phrogz那个bug报告有点有趣。但我认为这不适用于这种情况。