コードが次のような奇妙な状況に陥っています。
c = Class.new { eval parser }
... IRB (ruby 1.9.3) では動作しますが、コードでは動作しません。メソッドをラップする「class Foo」の有無にかかわらず試してみました。控えめに言っても、これはイライラします。文字列パーサーのコンテンツを irb の変数パーサーに直接コピーし、上記の行を使用してクラスを作成すると、メソッドはすべてそこにありますが、コードで実行すると、そうではありません。
コードが次のような奇妙な状況に陥っています。
c = Class.new { eval parser }
... IRB (ruby 1.9.3) では動作しますが、コードでは動作しません。メソッドをラップする「class Foo」の有無にかかわらず試してみました。控えめに言っても、これはイライラします。文字列パーサーのコンテンツを irb の変数パーサーに直接コピーし、上記の行を使用してクラスを作成すると、メソッドはすべてそこにありますが、コードで実行すると、そうではありません。
C = Class.new
C.class_eval(code)
...ファイルに保存されている場合でも、Ruby 1.9.2 で動作します。1.9.3 で動作するか試していただけますか?
私はそれを解決しました。
状況は、最適化されたパーサーを作成するために定義を動的に作成していて、段階的に追加された文字列を使用してそれを構築していたというものでした。ご想像のとおり、特に MySQL クエリでは、多くの引用符のエスケープが必要でした。irbでテストしたとき、使用することを忘れていました
puts parser
...印刷中に文字列を評価し、その間に1レベルのエスケープを削除しました。
解決策は簡単でした。class_eval する前に文字列を評価します。
fetchclass = Object.const_set(
characteristics['shortname'],
Class.new { class_eval( eval parser ) } )