猫の魔法

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

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

※この記事の最後のプログラムはバグがあります。正しい物は下記の物を参照して下さい。
再々考:classとそれが読み込んでいるmoduleの一覧を表示する方法(bugfix) - 猫の魔法

今日、Module#ancestorsという インスタンスメソッドを目にしたのだが、このメソッドを使えば、このブログの一番最初に書いたプログラムがもっと簡単に組める事に気がついた。

nekomaho.hatenablog.jp

def display_class_modules(class_name)
  class_name.ancestors.each do |klass| 
     puts "class:#{klass},modules:#{klass.included_modules}" if klass.is_a?(Class)
  end
end

古いやつと比較してみるとバッチリ結果が一緒になった。

def display_class_modules_old(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


def display_class_modules(class_name)
  class_name.ancestors.each do |klass|
     puts "class:#{klass},modules:#{klass.included_modules}" if klass.is_a?(Class)
  end
end

puts 'same' if display_class_modules(1.class) == display_class_modules(1.class)


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

少しずつrubyにも慣れて来たかな。もっとプログラムを書く時間が欲しい。