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$ 

irbrc の読み込みを避けるために -f を付けて実行しました。入力すると nil になると予想していますa。何が起こっているのか、回避策はありますか? /ブロックでラップしようとaしましたが、何もしませんでした。beginrescue 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 に答える