シナリオ:
-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$
irbrc の読み込みを避けるために -f を付けて実行しました。入力すると 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
、エラーが発生します。