せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】【メタプログラミング】class_eval と instance_eval

 
■topic summary
difference between "class_eval" and "instance_eval"

 

class_eval と instance_eval

class String
  class_eval("p self")
  instance_eval("p self")
end

 
■実行結果

String
String

コンテキストは同じ。

 

生成されるメソッドタイプが違う

class String
  class_eval("def hoge1;end")
  instance_eval("def hoge2;end")
  p instance_methods.index(:hoge1)
  p public_methods.index(:hoge2)
end

 
■実行結果

110
1

class_evalがインスタンスメソッドで
instance_evalがクラスメソッド


 
前に、attrメソッドを自作しようとして四苦八苦している過程でclass_evalを発見したけど、この実装で大きくずれてないみたい。
 
・moduleにattrメソッドを実装
・class_evalの実行によるインスタンスメソッド作成
・文字列でのメソッド定義
 (自分はヒアドキュメントを使っていたけど、
   オライリーでは空文字列 "" にadd(<<)していく形で実装してる)


 
良かった良かった。