2012-02-15 1 views
1

У меня странная ситуация, когда код:класса с помощью Eval динамически созданной строки метода ДЕФа

c = Class.new { eval parser } 

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

+0

Какая ваша ошибка в своём кодексе? – shingara

+0

Нет ошибки, пока я не попытаюсь создать экземпляр нового класса. Когда я пытаюсь использовать обновленную инициализацию (которая передает его дескриптор БД), который терпит неудачу. –

+0

Может быть, более полный фрагмент кода может помочь – shingara

ответ

0

Я решил.

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

puts parser 

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

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

fetchclass = Object.const_set(
       characteristics['shortname'], 
       Class.new { class_eval(eval parser) }) 
+0

Рад слышать, что вы прибили его! –

2
C = Class.new 
C.class_eval(code) 

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

+0

Такая же ошибка. 'code' fetchclass = Class.new fetchclass.class_eval (анализатор) ставит fetchclass.instance_methods.to_s ## не показывать мои методы инст = fetchclass.new (@db) # crashes 'code' Или, должен ли я включать * весь класс def в строку, включая * class Foo *? –

+0

Я перетаскиваю 1.9.2p290 для установки более 1.9.3, так как ruby-debuug19 также, кажется, задыхается на 1.9.3. :) –

+0

1.9.2p290 не умирает с инициализацией (@db), но он по-прежнему не содержит методов и не работает, когда я пытаюсь вызвать выборку. ruby-debug19 тоже не работает, поэтому я не могу вникать. –

 Смежные вопросы

  • Нет связанных вопросов^_^