LoginSignup
18
13

More than 5 years have passed since last update.

Rubyの全クラスを出力する

Last updated at Posted at 2015-03-19

以下のコードを実行すると、Rubyの全クラスを出力する。

全クラスをputsで出力
ObjectSpace.each_object(Class) do |klass|
  puts klass.name
end

仕組み

ObjectSpace#each_object(klass)は、引数で指定したklassとObject#kind_of?(mod)の関係にある全てのオブジェクトに対して繰り返し処理を行うモジュール関数。

Object#kind_of?(mod)は、以下の条件でtrueを返す

  • オブジェクトがmodあるいはそのサブクラスのインスタンスである
  • オブジェクトがmodをインクルードしたクラスかそのサブクラスのインスタンスである
Object#kind_of?の使用例
'str'.kind_of?(String) # => true
100.kind_of?(Fixnum)   # => true
[].kind_of?(Array)     # => true

# Fixnum < Integer < Numeric < Object < BasicObjectの関係なので以下全てtrue
100.kind_of?(Integer)     # => true
100.kind_of?(Numeric)     # => true
100.kind_of?(Object)      # => true
100.kind_of?(BasicObject) # => true

# ArrayはEnumerableモジュールをインクルードしているのでtrue
[].kind_of?(Enumerable) # => true

全てのクラスはClassクラスのサブクラスであるので、イコール全てのクラスはClassクラスとkind_of?の関係にあると言える。
なので、ObjectSpace#each_object(klass)の引数にClassを指定することで全クラスが取得できる。

終わりに

特定のモジュールをインクルードしたクラス一覧や特定のメソッドを持つクラス一覧を確認したくて色々調べてるうちに、全クラス取得する方法に辿り着いた。

ObjectSpaceモジュールはほとんど使ったことがなかったのでこの投稿が正しいか少し不安だけど、マニュアル見る限りでは大丈夫だと思う...(゚A゚;)ゴクリ

参考

18
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13