2012-04-28 8 views
0
module CallableDict 
    def method_missing method 
    puts x["#{method}"] 
    end 
end 

上記のコードは私のモジュールです。ハッシュキーを呼び出し可能にします。私もそれを実行すると...なぜ私はSystemStackErrorを取得していますか?

require 'callabledict' 
x = {"foo" => "ruby"} 
x.extend CallableDict 
x.foo 

は私が...

SystemStackError: stack level too deep 
    from /Users/Solomon/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/workspace.rb:80 
Maybe IRB bug! 

なぜを次のですか? HPはこれを修正できますか?

+1

私はまた、何度も何度もXを呼び出しますので、あなたは、再帰呼び出しであるmethod_missing' 'で 'X'を呼び出すと思います。 – Peterdk

答えて

3

実際xは、あなたがこのようにそれを書き換えることができますので、selfです:method_missingの実装で

module CallableDict 
    def method_missing method 
    puts self["#{method}"] 
    end 
end 
+0

+1、それは 'x'であり、' method'ではありません。 –

0

Rubyは右に変数としてxを見ていないとして、xは、メソッド名として扱われます範囲。インタプリタがx["#{method}"]を見ると、あなたは、xというメソッドから返されたハッシュや他のオブジェクトにインデックスを作成していると考えます。 xというメソッドがないため、Rubyはmethod_missingを呼び出します。method_missingは、再び自身を呼び出し、Rubyがスタックオーバーフローするまでこのプロセスを繰り返します。

修正は簡単です。 @nashは、上述したように、あなたは名前xは意味がありません、なぜならmethod_missingで、selfxを交換する必要がありますが、名前selfは(C用語で、彼らは同じポインタです)同じ参照です。また、あなたがmethod_missingの実装でこれを行うことにより、コードを読みやすくすることができます:

puts self[method.to_s] 
関連する問題