[Ruby] Q: module_eval

Yuri Leikind y.leikind на sam-solutions.net
Пн Сен 20 12:11:43 MSD 2004


On Mon, 20 Sep 2004 10:12:35 +0400
"Alexey I. Froloff" <raorn на immo.ru> wrote:

>      Использую ruby-activeldap, он создаёт классы примерно следующим
>      образом:
>      
>      class Base
>        def Base.create_object(config={})
>          [...]
>          self.class.module_eval <<-"end_eval"
>            class ::#{class_name} < Base
>              [...]
>            end
>          end_eval
>        end
>      end
>      
>      В своей программе я вызываю несколько раз Base.create_object() с
>      нужными параметрами и по идее возвращаемое значение должно быть
>      новосозданным классом.  Или нет?

В данном примере возвращается nil. Это то что возвращает module_eval 

>      
>      Тогда второй вопрос - как мне получить этот новый класс?  Типа:
>      
>      klass = Base.create_object()
>      [...]
>      obj = klass.new()


Откуда там берется class_name?

В любом случае создается класс с этим именем. 

Вот:

class Base
  def Base.create_object(name)
    self.class.module_eval <<-"end_eval"
      class ::#{name} < Base
        def qqq
            puts "qqq"
        end
      end
    end_eval
  end
end


puts Base.create_object("AAA")

AAA.new.qqq


-- 
Best regards,
Yuri Leikind

"Миротворец - это человек, который кормит крокодила в надежде, что тот сожрет его последним"

Уинстон Черчилль


Подробная информация о списке рассылки Ruby