Я использую 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. Теперь это работает!
Это не может работать по той простой причине, что '@ @ base', очевидно, не является переменной экземпляра. –
голосование меня немного грубо, учитывая, что вы даже не предложили ответа .... – TheDelChop