Я использую 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
new 'из test2.rb: 24: в `'
Из моего понимания Struct.new, блок выполняется с контекстом создаваемого класса, поэтому @@ base должен быть разрешаем.
Спасибо за ваше время!
Редактировать: Спасибо - я сделал init_on self.init_on и использовал class_variable_set, а не instance_variable_set.Теперь это работает!