ローカル変数隔離して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