我有一个奇怪的情况,代码:
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'ing之前评估我的字符串。
fetchclass = Object.const_set(
characteristics['shortname'],
Class.new { class_eval( eval parser ) } )