Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | ObjectSpace

概要

ObjectSpace

詳細

全てのオブジェクトを操作するモジュール、ObjectSpaceについて。

RailsActiveSupportのsubclasses.rbを読んでいる最中にObjectSpaceをはじめてみた。
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/class/subclasses.rb

サンプル

# encoding: utf-8
require 'pp'
require 'tbpgr_utils'

class Hoge
  def hoge
    "hoge"
  end
end

class HogeChild < Hoge
  def hoge
    "#{super}_child"
  end
end
h = Hoge.new
h2 = Hoge.new
hc = HogeChild.new

# オブジェクト解放時の処理を登録
ObjectSpace.define_finalizer(h) {puts "finalize"}

# オブジェクトを種類ごとにカウントした結果を Hash として返す
p ObjectSpace.count_objects

# Object#kind_of?の関係にあるオブジェクト全体への操作
ObjectSpace.each_object(Hoge) do |hoge|
  puts hoge.hoge
end

出力

{:TOTAL=>30690, :FREE=>277, :T_OBJECT=>1907, :T_CLASS=>498, :T_MODULE=>25, :T_FLOAT=>7, :T_STRING=>18451, :T_REGEXP=>78, :T_ARRAY=>4871, :T_HASH=>153, :T_STRUCT=>2, :T_BIGNUM=>9, :T_FILE=>13, :T_DATA=>1112, :T_MATCH=>34, :T_COMPLEX=>1, :T_NODE=>3227, :T_ICLASS=>25}
hoge_child
hoge
hoge
finalize