クラスごとのインスタンスの数を数える関数
クラスごとのインスタンスの数を数える関数を書きました。
#インスタンスの数を数える def count_instance count = {} ObjectSpace.each_object {|object| clazz = object.class.to_s count[clazz] ||= 0 count[clazz] += 1 } return count end #インスタンスの数を出力する def dump_instance_count count_instance.each_pair {|k,v| puts "#{k} : #{v}" } end
利用例。
# テスト用クラス class Kitten; end kittens = [] puts "\n---01" dump_instance_count puts "\n---02" kittens << Kitten.new dump_instance_count puts "\n---03" kittens << Kitten.new dump_instance_count puts "\n---04" kittens << Kitten.new dump_instance_count
実行結果です。Kittenの数が1つずつ増えています。
---01 Object : 3 ThreadGroup : 1 Bignum : 1 NoMemoryError : 1 Thread : 1 Module : 16 Array : 7 Class : 180 Hash : 1 IO : 3 SystemStackError : 1 fatal : 1 Float : 5 Binding : 1 File : 1 String : 201 ---02 Object : 3 ThreadGroup : 1 Bignum : 1 NoMemoryError : 1 Thread : 1 Module : 16 Array : 23 Class : 180 Hash : 2 IO : 3 SystemStackError : 1 fatal : 1 Float : 5 Binding : 1 Kitten : 1 File : 1 String : 689 ---03 Object : 3 ThreadGroup : 1 Bignum : 1 NoMemoryError : 1 Thread : 1 Module : 16 Array : 40 Class : 180 Hash : 3 IO : 3 SystemStackError : 1 fatal : 1 Float : 5 Binding : 1 Kitten : 2 File : 1 String : 1671 ---04 Object : 3 ThreadGroup : 1 Bignum : 1 NoMemoryError : 1 Thread : 1 Module : 16 Array : 42 Class : 180 Hash : 4 IO : 3 SystemStackError : 1 fatal : 1 Float : 5 Binding : 1 Kitten : 3 File : 1 String : 2847