Доступ к переменной класса в блоке Struct.new - PullRequest
2 голосов
/ 04 февраля 2011

Я использую 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.Теперь это работает!

1 Ответ

0 голосов
/ 04 февраля 2011

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

...