Создание класса с использованием eval динамически созданной строки метода def
У меня странная ситуация, когда код:
c = Class.new { eval parser }
... работает в IRB (ruby 1.9.3), но не в коде. Я попробовал это с и без 'класса Foo', оборачивая мои методы. Это расстраивает, если не сказать больше. Я могу скопировать содержимое синтаксического анализатора строк непосредственно в анализатор переменных в irb, а затем создать класс, используя приведенную выше строку, и все мои методы есть, но когда я делаю это в коде, это не так.
2 ответа
Я решил это.
Ситуация состояла в том, что я динамически создавал определения для создания оптимизированного синтаксического анализатора, и я строил его, используя постепенно добавляемые строки. Как вы можете себе представить, было много экранирования, особенно с запросами MySQL. Когда я тестировал в IRB, я забыл, что с помощью
puts parser
... оценил строку во время печати, удаляя при этом один уровень экранирования.
Решение было простое: проверьте мою строку перед class_eval'ing.
fetchclass = Object.const_set(
characteristics['shortname'],
Class.new { class_eval( eval parser ) } )
C = Class.new
C.class_eval(code)
... У меня работает в Ruby 1.9.2, даже если он сохранен в файле. Можете ли вы попробовать и посмотреть, работает ли он в 1.9.3?