ローカル変数隔離してeval
ローカル変数が"cpp"(と"_erbout")だけの新規スコープを作ってそこでevalしたかった。
現在の実装ではメソッド内メソッドを定義してやってそこのbindingでevalしてます。
もっといい書き方があれば教えてください。
http://websvn.nyaxtstep.com/viewvc.cgi/configpp/configpp.rb
ConfigPP::ConfigPP.process抜粋。
# second pass : actually parse the file using erb out_filename = @out_filename ? @out_filename : filename def evalenv cpp = ConfigPPRuntime.new(@options) binding end erb = ERB.new(File.readlines(filepath), nil, @erb_trimming) erb.filename = File.basename(filepath) puts erb.result(evalenv)
追記:
動的に新規クラスを作るようにして、cppをクラス変数にすればいいかもしれない。試す。
こんな感じになった。
# second pass : actually parse the file using erb out_filename = @out_filename ? @out_filename : filename evalenvklass = Class.new erb = ERB.new(File.readlines(filepath), nil, @erb_trimming) erb.def_method(evalenvklass, '_process', File.basename(filepath)) options = @options evalenv = evalenvklass.new evalenv.instance_eval do @cpp = ConfigPPUtil.new(filename, versioninfo, options) end puts evalenv._process