Как в 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
, так что она является исчерпывающей в своем поиске и правильной с точки зрения разрешения диспетчеризации методов.
спасибо!