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