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

上記のコードは私のモジュールで、ハッシュキーを呼び出し可能にします。それを実行すると...

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!

なんで?これを修正できますか?

4

2 に答える 2

3

実際にxは aselfなので、次のように書き換えることができます。

module CallableDict
  def method_missing method
    puts self["#{method}"]
  end
end
于 2012-04-28T12:08:24.130 に答える
0

の実装ではmethod_missing、 Ruby が正しいスコープで変数xとして認識していないため、 はメソッド名として扱われます。xインタプリタがx["#{method}"]を参照すると、 というメソッドから返されたハッシュまたはその他のオブジェクトにインデックスを作成していると見なしますx。と呼ばれるメソッドがないためx、Ruby は your を呼び出しmethod_missing、それが再び自分自身を呼び出し、Ruby がスタック オーバーフローに遭遇するまでこのプロセスを繰り返します。

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

puts self[method.to_s]
于 2012-04-28T13:57:18.813 に答える