1. ホーム
  2. ruby

[解決済み] Rubyでクラスの全子孫を検索する

2022-04-27 06:36:38

質問

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アプリケーションでベースクラスから派生したモデルをすべて見つけてリストアップしたいからです。そのようなモデルで動作するコントローラがあり、コントローラを修正することなく新しいモデルを追加できるようにしたいのです)。

どのように解決するのですか?

以下はその例です。

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

は、Parent.descendants が与えるものを表示します。

GrandChild
Child

はChild.descendantsが与えてくれるものです。

GrandChild