访问Struct.new块中的类变量

时间:2011-02-04 20:15:20

标签: ruby class-variables

我正在使用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:in 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 :(得分:-1)

为什么不尝试使用self.instance_variable_set(:@@base, $base_module)之类的东西。我认为这可能有用,因为你只是设置了类对象的实例变量。