バリケンのRuby日記 RSSフィード

2006-05-28

[] eval  eval - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  eval - バリケンのRuby日記  eval - バリケンのRuby日記 のブックマークコメント

Kernel#evalは、引数として与えられた文字列をRubyスクリプトとして評価するよ。たとえば、

a = 'puts "Hello, world!"'
eval(a)

と書くと、次のような実行結果になるよ。

Hello, world!

戻り値は、一番最後に評価された式の戻り値になるみたい。たとえば、

a = '[ 3, 4, 5 ]; [ 6, 7, 8 ]'
eval(a).each {|x| puts x}

と書くと、次のような実行結果になるよ。

6
7
8

こんなふうに単に文字列がRubyスクリプトそのままの記述だとあんまり面白みがないけど、文字列を動的に生成してから評価するとかが出来るから、(たとえばメソッド名をdefで動的に生成するとか)工夫次第でかなり面白いことができるよ。

あとは、ちょっとした設定ファイルが欲しいときとか(ユーザーデフォルト値を変更してから使うような用途のスクリプトとか)、設定項目をHashにしてconfigファイルにしちゃうとかの用途にも使えるよ。たとえば/etc/hoge.confとかに

{
  :hoge_name => 'hogehoge',
  :hoge_param_1 => 5,
  :hoge_param_2 => 100,
  :hoge_param_3 => 5000,
}

とか設定ファイルを外出ししておいて、メインスクリプトでは

hoge_config = Hash.new

eval(File.open('/etc/hoge.conf').read).each {|key, value|
  hoge_config[key] = value
}

として読み込むようなスクリプトにすれば、ユーザーには/etc/hoge.confだけを変更してもらえば良くなるから便利だよ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20060528