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