オブジェクトの特異メソッドを定義する(明示的に特異クラスのインスタンスメソッドとして定義する場合)

今度こそinstance_evalとmodule_evalを理解してもらった
最近の基礎シリーズいいです!もっとやってほしい!

環境

# ruby -v
ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin9]

Objectのオブジェクトobj

>> obj = Object.new
=> #<Object:0x1a896d8>
>> block = Proc.new do
?>   def foo
>>    'foo'
>>   end
>> end
=> #<Proc:0x01a835bc@(irb):4>

objの特異クラスを取り出してインスタンスメソッドを定義

>> eigenclass = class << obj; self; end
=> #<Class:#<Object:0x1a896d8>>
>> eigenclass.module_eval &block
=> nil
>> eigenclass.__send__(:define_method, :hoge){ "hoge" }
=> #<Proc:0x01a7f7f0@(irb):3>
>> obj.foo
=> "foo"
>> obj.hoge
=> "hoge"

特異クラスをインスタンス化できない

>> obj2 = eigenclass.new
TypeError: can't create instance of virtual class
        from (irb):16:in `new'
        from (irb):16

このあたりの話で個人的に分かりやすかったのは実践Rails

実践 Rails ―強力なWebアプリケーションをすばやく構築するテクニック
実践 Rails ―強力なWebアプリケーションをすばやく構築するテクニック株式会社クイープ

オライリージャパン 2008-10-27
売り上げランキング : 242014

おすすめ平均 star
star訳が残念すぎます
star「Railsの外側」の問題解決の宝庫

Amazonで詳しく見る
by G-Tools