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

时间:2014-03-17 08:36:11

标签: ruby inheritance subclass

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

B

各种类中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

3 个答案:

答案 0 :(得分:4)

这是我自己的解决方案。

class Class
  def instance_methods_within klass
    ancestors
    .select{|k| k <= klass}
    .inject([]){|a, k| a.concat(k.instance_methods(false))}
    .uniq
  end
end

Marc-AndréLafortune建议:

class Class
  def instance_methods_within klass
    ancestors
    .select{|k| k <= klass}
    .flat_map{|k| k.instance_methods(false)}
    .uniq
  end
end

答案 1 :(得分:2)

我相信你正在寻找这个:

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, :b, :c]
A.instance_methods_within(B) # => [:a, :d, :b]
A.instance_methods_within(D) # => [:a, :d]
A.instance_methods_within(A) # => [:a]  (Same as A.instance_methods(false))

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

答案 2 :(得分:-1)

我想提出这个: -

    class Class
      def instance_methods_within(klass = nil)
        imethods = instance_methods
        own_imethods = instance_methods(false)
        return imethods if [Object, Kernel, nil].include?(klass) || [BasicObject, nil].include?(klass.superclass)
        sc_imethods = klass.superclass.instance_methods
        own_imethods | (imethods - sc_imethods)
      end
    end