从Ruby中的方法中检索Method实例
这是如何确定方法定义的类的后续问题? (希望你不介意相似之处)
给定一个类层次结构,方法可以检索自己的Method
实例吗?
class A def foo puts "A#foo: `I am #{method(__method__)}'" end end class B < A def foo puts "B#foo: `I am #{method(__method__)}'" super end end A.new.foo # A#foo: `I am #' B.new.foo # B#foo: `I am #' # A#foo: `I am #' # <- A#foo retrieves B#foo
所以B.new.foo
反而打印
# B#foo: `I am #' # A#foo: `I am #' # <- this is what I want
在上一个问题中, JörgWMittag怀疑检索类中定义的方法可能会违反面向对象的范例。 这也适用于此吗?
一个方法不应该“了解自己”吗?
我发现了一种确切的方法 。
class A def foo puts "A#foo: `I am #{method(__method__).super_method || method(__method__)}'" end end
我真的很佩服Matz和Ruby核心开发人员。 这种方法的存在意味着他们考虑到了这种情况,并考虑过如何处理它。
建立在如何确定一个方法定义的类的答案? 和super_method
关于super_method
的答案,你可以使用:
def meth(m, clazz) while (m && m.owner != clazz) do m = m.super_method end return m end class A def foo puts "A#foo: `I am #{meth(method(__method__), Module.nesting.first)}'" end end class B < A def foo puts "B#foo: `I am #{meth(method(__method__), Module.nesting.first)}'" super end end B.new.foo # B#foo: `I am #' # A#foo: `I am # '
这里的想法是,既然我们知道方法由Module.nesting.first
定义的类/模块,我们采用method(__method__)
找到的当前方法对象并遍历其method(__method__)
来查找其所有者为与定义方法的类/模块相同。