设想:
-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_variables
或eval
导致错误。