Rubyのevalの使い方まとめ
タグ: ruby / 初版公開: 2013-12-11

Rubyのevalは文字列をその場でRubyのコードと解釈して、実行してしまう強力なメソッドだ。evalには以下の種類があり、どのようなコンテキストで式を評価するのかが異なる。

# メソッド 動作
1 Kernel#eval そのコンテキストで式を評価する
2 Module#class_eval クラスをselfとして式を評価する
3 Module#module_eval モジュールをselfとして式を評価する
4 BasicObject#instance_eval オブジェクトをselfとして式を評価する

最も良く使われるのは、Kernel#evalBasicObject#instance_evalだろう。以下に参考のコードを示す。Kernel#evalmainのコンテキストで解釈され、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)
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 10,788