以下のコードを実行すると、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゚;)ゴクリ
参考