Rubyのevalは文字列をその場でRubyのコードと解釈して、実行してしまう強力なメソッドだ。evalには以下の種類があり、どのようなコンテキストで式を評価するのかが異なる。
| # | メソッド | 動作 |
|---|---|---|
| 1 | Kernel#eval | そのコンテキストで式を評価する |
| 2 | Module#class_eval | クラスをselfとして式を評価する |
| 3 | Module#module_eval | モジュールをselfとして式を評価する |
| 4 | BasicObject#instance_eval | オブジェクトをselfとして式を評価する |
最も良く使われるのは、Kernel#evalとBasicObject#instance_evalだろう。以下に参考のコードを示す。Kernel#evalはmainのコンテキストで解釈され、Object#evalはレシーバのobjオブジェクトのコンテキストで解釈されていることがわかる。
eval "p self" # => main
obj = Object.new
obj.instance_eval "p self" # => #<Object:0x000000010c8ec8>
特にBasicObject#instance_evalは、インスタンス変数に外部からアクセスしたり、メソッドを動的に定義する手段として使われることが多い印象がある。少し複雑なメタプログラミングをする上では頻出である。
evalと関連するメソッドについては、パーフェクトRubyの7-3に詳しい解説があるので、興味のある人はそちらを参照してほしい。
パーフェクトRuby (PERFECT SERIES 6)
posted with amazlet at 13.12.01
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 10,788
技術評論社
売り上げランキング: 10,788

