我可以很容易地在Ruby中提升类层次结构:
String.ancestors # [String, Enumerable, Comparable, Object, Kernel]
Enumerable.ancestors # [Enumerable]
Comparable.ancestors # [Comparable]
Object.ancestors # [Object, Kernel]
Kernel.ancestors # [Kernel]
有没有办法也向下递减层次结构?我想这么做
Animal.descendants # [Dog, Cat, Human, ...]
Dog.descendants # [Labrador, GreatDane, Airedale, ...]
Enumerable.descendants # [String, Array, ...]
但是似乎没有descendants
方法。
(之所以出现这个问题,是因为我想在Rails应用程序中查找从基类派生的所有模型并列出它们;我有一个控制器,可以处理任何这样的模型,并且我希望能够添加新模型,而不必修改控制器。)
发布于 2010-03-07 03:04:12
下面是一个示例:
class Parent
def self.descendants
ObjectSpace.each_object(Class).select { |klass| klass < self }
end
end
class Child < Parent
end
class GrandChild < Child
end
puts Parent.descendants
puts Child.descendants
puts Parent.descendants为您提供:
GrandChild
Child
puts Child.descendants为您提供:
GrandChild
发布于 2013-10-05 01:59:30
如果您使用Rails >= 3,则有两个选项。如果需要多个级别的子类深度,请使用.descendants
,或者对第一级的子类使用.subclasses
。
示例:
class Animal
end
class Mammal < Animal
end
class Dog < Mammal
end
class Fish < Animal
end
Animal.subclasses #=> [Mammal, Fish]
Animal.descendants #=> [Dog, Mammal, Fish]
发布于 2010-03-07 03:48:22
带有漂亮的链式迭代器的Ruby 1.9 (或1.8.7):
#!/usr/bin/env ruby1.9
class Class
def descendants
ObjectSpace.each_object(::Class).select {|klass| klass < self }
end
end
Ruby 1.8.7之前版本:
#!/usr/bin/env ruby
class Class
def descendants
result = []
ObjectSpace.each_object(::Class) {|klass| result << klass if klass < self }
result
end
end
像这样使用它:
#!/usr/bin/env ruby
p Animal.descendants
https://stackoverflow.com/questions/2393697
复制相似问题