是否有内置的Ruby方法或知名的库来返回对象的整个方法查找链?Ruby查看一个令人困惑的类序列(如本问题中所讨论的),例如对应于消息的方法,method_missing如果没有类响应消息,则调用接收器.
我把以下代码放在一起,但我确定它缺少某些情况,或者它是100%正确的.请指出任何缺陷,并指导我一些更好的代码,如果它存在.
def method_lookup_chain(obj, result = [obj.singleton_class])
if obj.instance_of? Class
return add_modules(result) if result.last == BasicObject.singleton_class
r = result.last.superclass
method_lookup_chain(obj, result << r)
else
return result + obj.class.ancestors
end
end
def add_modules(klasses)
r = []
klasses.each_with_index do |k, i|
r << k
next if k == klasses.last
r << (k.included_modules - klasses[i+1].included_modules)
end
r.flatten
end
# EXAMPLES
module ClassMethods; end
module MoreClassMethods; end
class A
extend ClassMethods
extend MoreClassMethods
end
p method_lookup_chain(A) # => [#<Class:A>, MoreClassMethods, …Run Code Online (Sandbox Code Playgroud) ruby ×1