【问题标题】:Accessing a class variable in Struct.new block访问 Struct.new 块中的类变量
【发布时间】:2011-02-04 20:15:20
【问题描述】:

我正在使用 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:innew' 来自 test2.rb:24:in `'

根据我对 Struct.new 的理解,该块是在创建的类的上下文中执行的,所以 @@base 应该是可解析的。

感谢您的宝贵时间!

编辑: 谢谢 - 我做了 init_on self.init_on 并使用了 class_variable_set 而不是 instance_variable_set。现在可以了!

【问题讨论】:

    标签: ruby class-variables


    【解决方案1】:

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

    【讨论】:

    • 这不可能工作,原因很简单,@@base 显然不是实例变量。
    猜你喜欢
    • 2016-09-13
    • 2011-10-13
    • 1970-01-01
    • 2013-04-12
    • 2014-02-09
    • 1970-01-01
    • 2011-08-28
    • 2017-06-18
    • 2016-02-17
    相关资源
    最近更新 更多