我有一个奇怪的情况,其中的代码:
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
...在打印时评估字符串,在这样做时删除一级转义。
解决方案很简单:在class_eval之前评估我的字符串。
fetchclass = Object.const_set(
characteristics['shortname'],
Class.new { class_eval( eval parser ) } )