Bitbucket

自分用の技術メモ

Getting all classes in current Ruby process

現時点で定義されている全てのクラスを得るためには ObjectSpace.each_object を利用する。

1
2
3
def get_classes
  ObjectSpace.each_object(Class).to_a
end

用途

通常のプログラム中で役に立つ場面はあまり無いが、 少し特殊な用途には役立つことがある。 具体的にはプラグイン機構を作るため、次のように利用した。

  1. プラグインファイルを require する
  2. 追加されたクラス = プラグインのクラス を取得する
  3. プラグインの各クラスに対して処理 (インスタンスの作成や初期化) を行う
プラグインのロード
1
2
3
4
5
6
7
def load_plugins(files)
  classes_before = get_classes
  files.each do |file|
    require file
  end
  get_classes - classes_before
end

Cinch を利用した IRC bot プログラム (Ruby初心者の頃に作成したものなので、酷いコードが混じっているはず) では、 Cinch::Plugininclude しているものをプラグインのクラスとして判定した。

1
get_classes.select { |c| c.include?(Cinch::Plugin) }

Comments