2011-02-04 3 views
2

Я использую Struct.new для создания новых классов «на лету» (мы используем промежуточное программное обеспечение для моделирования объектов, и я хочу генерировать конкретные типы «на лету» для сериализации).Доступ к переменной класса в блоке Struct.new

В сущности у меня есть этот код:

module A 
    def self.init_on(target) 
     target.foo = 123 
    end 
end 

$base_module = A 


module Test 
    C = Struct.new(:id) do 
     include $base_module 

     @@base = $base_module 

     def initialize 
      @@base.init_on(self) 
     end 

     attr_accessor :foo 
    end 
end 

c = Test::C.new 
puts c.foo 

я получаю эту ошибку, когда я запускаю мой тест:

test2.rb: 17: в initialize': uninitialized class variable @@base in Test::C (NameError) from test2.rb:24:in новый» от test2.rb: 24: in `'

Из моего понимания Struct.new блок выполняется с контекстом создаваемого класса, поэтому база @@ должна быть разрешимой.

Спасибо за ваше время!

Редактировать: Спасибо - Я сделал init_on self.init_on и использовал class_variable_set, а не instance_variable_set. Теперь это работает!

ответ

-1

Почему бы не попытаться использовать что-то вроде self.instance_variable_set(:@@base, $base_module). Я думаю, что это может сработать, поскольку вы просто устанавливаете переменную экземпляра объекта класса.

+1

Это не может работать по той простой причине, что '@ @ base', очевидно, не является переменной экземпляра. –

+0

голосование меня немного грубо, учитывая, что вы даже не предложили ответа .... – TheDelChop

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