猫の魔法

主にruby系の技術メモを記載

classとそれが読み込んでいるmoduleの一覧を表示する方法

クラスの継承関係と各クラスで読み込んでいるモジュールの一覧を表示したかったので作ってみた。

def display_class_modules(class_name)
  print "class:#{class_name},modules:#{class_name.included_modules}","\n" if class_name.respond_to?(:included_modules)
  display_class_modules(class_name.superclass) if class_name.respond_to?(:superclass)
end

display_class_modules(1.class)

#=> class:Fixnum,modules:[Comparable, Kernel]
#=> class:Integer,modules:[Comparable, Kernel]
#=> class:Numeric,modules:[Comparable, Kernel]
#=> class:Object,modules:[Kernel]
#=> class:BasicObject,modules:[]

1のクラスはFixnumでComparableとKernelモジュールをインクルードしている事と、 継承チェーンがFixnum->Integer->Numeric->Object->BasicObjectの順に上がっている事が分かる。

疑問点

  • Moduleは何処に行ったのだろう?(included_modulesにclass_nameが反応しているのにModule自体がイングルードしているモジュール一覧に出てこない)

改善ポイント

  • moduleの中のinclude関係も見れるとよい
  • もっと簡潔に書きたい(respond_to?とかまとめて書けないか)