Как программно определить, какой класс / модуль определяет вызываемый метод? - PullRequest
4 голосов
/ 15 октября 2010

Как в Ruby программно определить, какой класс / модуль определяет вызываемый метод?

Скажем, в данной области я вызываю some_method().В той же области я хотел бы вызвать функцию find_method(:some_method), которая бы возвращала, какой класс, класс Singleton или модуль определяет 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.ancestors, чтобы пройти по дереву наследования, используя method_defined?, чтобы проверить, определен ли метод в классеили Module, и, возможно, некоторые другие приемы для проверки областей от самого внутреннего до самого внешнего (поскольку код может выполняться внутри, например, instance_eval).

Я просто не знаю правильный порядок и всетонкости метамодели Ruby для реализации find_method, так что она является исчерпывающей в своем поиске и правильной с точки зрения разрешения диспетчеризации методов.

спасибо!

1 Ответ

8 голосов
/ 15 октября 2010

Обнаружено, что это было удивительно просто.Neat!

Расширение этого ответа , чтобы показать, как на самом деле вернуть класс владельца:

foo.method(:some_method).owner

Оберните это в методе экземпляра, если вы считаете это необходимым,но это не так уж и плохо, а?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...