ruby类可以静态跟踪子类吗?

时间:2011-10-15 00:18:05

标签: ruby

我的目标是:

class MyBeautifulRubyClass
  #some code goes here
end

puts MyBeautifulRubyClass.subclasses #returns 0

class SlightlyUglierClass < MyBeautifulRubyClass
end

puts MyBeautifulRubyClass.subclasses #returns 1
理想情况下甚至

puts MyBeautifulRubyClass.getSubclasses #returns [SlightlyUglierClass] in class object form

我确信这是可能的,只是不确定如何!

2 个答案:

答案 0 :(得分:9)

这是一种效率低下的方式:

Look up all descendants of a class in Ruby

有效的方法是使用inherited钩子:

class Foo
  def self.descendants
    @descendants ||= []
  end

  def self.inherited(descendant)
    descendants << descendant
  end
end

class Bar < Foo; end
class Zip < Foo; end

Foo.descendants #=> [Bar, Zip]

如果您需要了解后代的后代,可以递归来获取它们:

class Foo
  def self.all_descendants
    descendants.inject([]) do |all, descendant|
      (all << descendant) + descendant.all_descendants
    end
  end
end

class Blah < Bar; end

Foo.descendants     #=> [Bar, Zip]
Foo.all_descendants #=> [Bar, Blah, Zip]

答案 1 :(得分:0)

不确定是否可以在不使用Object http://snippets.dzone.com/posts/show/2992的情况下执行此操作,但可能已更改 - 只需一个解决方案。