【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(<<)していく形で実装してる)
良かった良かった。