Tbpgr Blog

Recruiting Operations tbpgr(てぃーびー) のブログ

ActiveSupport | Kernel#class_eval

概要

Kernel#class_eval

詳細

Kernel#class_evalについて

Kernel#class_eval

特異クラス(singleton_class)のclass_evalを呼び出すのと同等。

サンプル

# encoding: utf-8
require "active_support/core_ext/kernel/singleton_class"
require "tbpgr_utils"

class Hoge
  def hoge
    "hoge"
  end
end

def check_method_define(obj, binding)
  puts_eval "hoge.respond_to? :hoge", binding
  puts_eval "hoge.respond_to? :hige", binding
end

hoge = Hoge.new
puts "特異メソッド定義前"
puts_eval "hoge.respond_to? :hoge", binding
puts_eval "hoge.respond_to? :hige", binding

# ActiveSuportを利用しないで記述する場合
# hoge.singleton_class.class_eval do
hoge.class_eval do
  define_method :hige do
    "hige"
  end
end
puts "特異メソッド定義後"
puts_eval "hoge.respond_to? :hoge", binding
puts_eval "hoge.respond_to? :hige", binding

hege = Hoge.new
puts "特異メソッド定義後に他のオブジェクトには影響していないことの確認"
puts_eval "hege.respond_to? :hoge", binding
puts_eval "hege.respond_to? :hige", binding

出力

特異メソッド定義前
hoge.respond_to? :hoge # => true
hoge.respond_to? :hige # => false
特異メソッド定義後
hoge.respond_to? :hoge # => true
hoge.respond_to? :hige # => true
特異メソッド定義後に他のオブジェクトには影響していないことの確認
hege.respond_to? :hoge # => true
hege.respond_to? :hige # => false