我的目标是:
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
我确信这是可能的,只是不确定如何!
答案 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的情况下执行此操作,但可能已更改 - 只需一个解决方案。