shimgo
4/10/2016 - 9:41 AM

instance_evalによる特異メソッドの定義 singleton_classによる特異クラスの取得

instance_evalによる特異メソッドの定義 singleton_classによる特異クラスの取得

class Foo
end

foo = Foo.new

# 特異メソッドの定義
def foo.singular_method1
  p 'foo only method 1'
end
# instance_evalでも特異メソッドを定義可能
foo.instance_eval("def singular_method2 \n p 'foo only method 2' \nend" )

foo.singular_method1
foo.singular_method2

bar = Foo.new
bar.singular_method1 # 呼べない
bar.singular_method2 # 呼べない

# singleton_classでレシーバの特異クラスを取得してその特異クラスにだけアクセサを定義
foo.singleton_class.class_eval('attr_reader :hoge')
foo.instance_eval('@hoge = 1')
p foo.hoge

piyo = Foo.new
p piyo.hoge #元のクラスにはhogeが定義されていないためNoMethodError