Создание класса с использованием eval динамически созданной строки метода def - PullRequest
1 голос
/ 15 февраля 2012

У меня странная ситуация, когда код:

c = Class.new { eval parser }

... работает в IRB (ruby 1.9.3), но не в коде.Я попробовал это с и без 'класса Foo', оборачивая мои методы.Это расстраивает, если не сказать больше.Я могу скопировать содержимое анализатора строк непосредственно в анализатор переменных в irb, а затем создать класс, используя приведенную выше строку, и все мои методы будут там, но когда я делаю это в коде, это не так.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012
C = Class.new
C.class_eval(code)

... У меня работает в Ruby 1.9.2, даже если он сохранен в файле.Можете ли вы попробовать и посмотреть, работает ли он в 1.9.3?

0 голосов
/ 16 февраля 2012

Я решил это.

Ситуация состояла в том, что я динамически создавал определения для создания оптимизированного синтаксического анализатора, и я строил его, используя постепенно добавляемые строки.Как вы можете себе представить, было много экранирования, особенно с запросами MySQL.Когда я тестировал в irb, я забыл, что с помощью

puts parser

... вычисляется строка при печати, удаляя при этом один уровень экранирования.

Решение было простым: eval моя строка перед class_eval'ing.

fetchclass = Object.const_set(
                characteristics['shortname'],
                Class.new { class_eval( eval parser ) } )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...