3

设想:

-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 内容。我期望在输入时得到 nil 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​​ 中的一些模糊错误被 irb 触发了。此外,在定义 method_missing 之后,即使存在的方法也喜欢local_variableseval导致错误。

4

1 回答 1

9

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

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

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

于 2012-02-28T23:44:41.497 回答