Rubyのevalメソッドの使い方

Rubyで、与えられた文字列をそのままRubyのコードとして解釈して実行する evalメソッドについて説明します。

evalメソッドの使い方

eval メソッドは、Ruby の組み込みカーネルメソッドです。

eval(評価する式 [,Bindingオブジェクト, ファイル名, 行番号])

このうち、第1引数以外は省略可能です。第2引数のBindingオブジェクトとは、そのメソッドや変数が属する「文脈(スコープ)」が保存されているオブジェクトです。

参照:Ruby における Binding オブジェクトとは

以下より、サンプルコードを元に eval メソッドの使い方について説明します。

eval メソッドを使ったサンプル

例えば、putsメソッドでHello Rubyと表示する場合は、以下のようになります。

eval("puts 'Hello Ruby'")
# => Hello Ruby

第一引数で指定された文字列「"puts 'Hello Ruby'」が実行されていることがわかります。

Binding オブジェクトを指定する

Binding オブジェクトは、理解が難しいですが、次のようにしてみるとわかりやすいでしょう。

def sample
  a = 1
  binding ##fooの Binding オブジェクトを生成して返す
end

eval("p a")
#=> undefined local variable or method `a'

eval("p a", sample)
#=> 1

トップレベルから eval メソッドで sample メソッドのローカル変数 a を参照しようとしても、 undefined エラーとなります。

ですが、sample メソッドの Binding オブジェクトを第二引数で指定することで、変数 a を参照することができます。

詳しくは、以下のページで説明しているので参照してみてください。

参照:Ruby における Binding オブジェクトとは

こうした特性を利用すると、プログラムの自由度が飛躍的に高まります。

eval メソッドとメタプログラミング

Rubyの特徴として、プログラムにプログラムを書かせる「メタプログラミング」や、自分好みの言語を作る「DSL(Domain Specific Language)」が容易に実現できることが挙げられます。

evalメソッド やその仲間(eval族と呼ばれます)は、こうしたRubyの上級テクニックを実現するために、欠かせない役割を果たしています。


イベント

2017/12/05(火)
Design Thinking Square