首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >查找Ruby中某个类的所有后代

查找Ruby中某个类的所有后代
EN

Stack Overflow用户
提问于 2010-03-07 02:47:27
回答 14查看 72.3K关注 0票数 155

我可以很容易地在Ruby中提升类层次结构:

代码语言:javascript
复制
String.ancestors     # [String, Enumerable, Comparable, Object, Kernel]
Enumerable.ancestors # [Enumerable]
Comparable.ancestors # [Comparable]
Object.ancestors     # [Object, Kernel]
Kernel.ancestors     # [Kernel]

有没有办法也向下递减层次结构?我想这么做

代码语言:javascript
复制
Animal.descendants      # [Dog, Cat, Human, ...]
Dog.descendants         # [Labrador, GreatDane, Airedale, ...]
Enumerable.descendants  # [String, Array, ...]

但是似乎没有descendants方法。

(之所以出现这个问题,是因为我想在Rails应用程序中查找从基类派生的所有模型并列出它们;我有一个控制器,可以处理任何这样的模型,并且我希望能够添加新模型,而不必修改控制器。)

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2010-03-07 03:04:12

下面是一个示例:

代码语言:javascript
复制
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为您提供:

代码语言:javascript
复制
GrandChild
Child

puts Child.descendants为您提供:

代码语言:javascript
复制
GrandChild
票数 159
EN

Stack Overflow用户

发布于 2013-10-05 01:59:30

如果您使用Rails >= 3,则有两个选项。如果需要多个级别的子类深度,请使用.descendants,或者对第一级的子类使用.subclasses

示例:

代码语言:javascript
复制
class Animal
end

class Mammal < Animal
end

class Dog < Mammal
end

class Fish < Animal
end

Animal.subclasses #=> [Mammal, Fish] 
Animal.descendants  #=> [Dog, Mammal, Fish]
票数 70
EN

Stack Overflow用户

发布于 2010-03-07 03:48:22

带有漂亮的链式迭代器的Ruby 1.9 (或1.8.7):

代码语言:javascript
复制
#!/usr/bin/env ruby1.9

class Class
  def descendants
    ObjectSpace.each_object(::Class).select {|klass| klass < self }
  end
end

Ruby 1.8.7之前版本:

代码语言:javascript
复制
#!/usr/bin/env ruby

class Class
  def descendants
    result = []
    ObjectSpace.each_object(::Class) {|klass| result << klass if klass < self }
    result
  end
end

像这样使用它:

代码语言:javascript
复制
#!/usr/bin/env ruby

p Animal.descendants
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2393697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档