从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__)来查找其所有者为与定义方法的类/模块相同。