オブジェクトの特異メソッドを定義する(明示的に特異クラスのインスタンスメソッドとして定義する場合)
今度こそ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アプリケーションをすばやく構築するテクニック | |
株式会社クイープ オライリージャパン 2008-10-27 売り上げランキング : 242014 おすすめ平均 訳が残念すぎます 「Railsの外側」の問題解決の宝庫 Amazonで詳しく見る by G-Tools |