4

Rubyでは、どのクラス/モジュールが呼び出されているメソッドを定義しているかをプログラムで判断するにはどうすればよいですか?

与えられたスコープで私が呼び出すと言いsome_method()ます。find_method(:some_method)同じスコープで、どのクラス、シングルトン クラス、またはモジュールが定義するかを返す関数を呼び出したいと思いますsome_method

私が何を意味するかを説明するためのコードを次に示します。

class Foo
  include ...

  def bar
    ...
    some_method() # calls a method in scope, assume it exists

    find_method(:some_method) # Returns where the method is defined
                              # e.g. => SomeClassOrModule
    ...
  end
end

私は、リフレクション関数の複雑な混合物を使用する必要があると推測しています。継承ツリーから始めてself使用し、クラスまたはモジュールでメソッドが定義されているかどうかを確認し、おそらく他のトリックを使用してスコープを検査します。最も内側から最も外側へ (コードは、たとえば 内で実行される可能性があるため)。self.ancestorsmethod_defined?instance_eval

find_methodRuby メタモデルの正しい順序とすべての微妙な点を、完全に検索し、メソッド ディスパッチ解決の観点からも正しいように実装する方法がわからないだけです。

ありがとう!

4

1 に答える 1

8

これは驚くほど簡単であることがわかりました。きちんとした!

この回答を拡張して、所有者クラスを実際に返す方法を示します。

foo.method(:some_method).owner

必要に応じてそれをインスタンス メソッドにラップしますが、それほど悪くはありませんよね?

于 2010-10-15T01:29:54.613 に答える