ruby – 在类和它的某个祖先之间定义的实例方法

假设类A是类B的后代.获取B中定义的A的所有实例方法的列表(符号数组,顺序无关紧要)的最佳方法是什么,即在B或任何上定义的A的实例方法它的后代类?示例如下.类层次结构如下:

class C; def c; end end
class B < C; def b; end end
class D < B; def d; end end
class A < D; def a; end end

各种类中A的实例方法是:

A.instance_methods_within(Kernel) # =>  (Same as A.instance_methods)
A.instance_methods_within(C) # => [:a,:d,:b,:c]
A.instance_methods_within(B) # => [:a,:b]
A.instance_methods_within(D) # => [:a,:d]
A.instance_methods_within(A) # => [:a]  (Same as A.instance_methods(false))

解决方法

我相信你在寻找这个:

class Class
  def instance_methods_within(klass)
    return self.instance_methods if klass == Object
    methods = []
    this = self
    while this != nil
      methods << this.instance_methods(false)
      break if this == klass
      this = this.superclass
    end

    return methods.flatten
  end
end

class C; def c; end end
class B < C; def b; end end
class D < B; def d; end end
class A < D; def a; end end

A.instance_methods_within(Object) # =>  (Same as A.instance_methods)
A.instance_methods_within(C) # => [:a,:d]
A.instance_methods_within(A) # => [:a]  (Same as A.instance_methods(false))

添加了Object as Object.instance_methods(false)yield []的特殊情况,因此在这种情况下向上遍历的循环不会很好.更新以将instance_methods_within类定义为Class的实例方法.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...