子类中的Ruby类实例变量

时间:2015-05-30 10:13:56

标签: ruby oop syntax class-variables

依靠this answer,我写了下面的课程。使用它时,我收到一个错误:

  'serialize'中的

:未定义的方法'[] ='为nil:NilClass(NoMethodError)。

如何在基类中访问变量@serializable_attrs

基类:

# Provides an attribute serialization interface to subclasses.
class Serializable
    @serializable_attrs = {}

    def self.serialize(name, target=nil)
        attr_accessor(name)
        @serializable_attrs[name] = target
    end

    def initialize(opts)
        opts.each do |attr, val|
            instance_variable_set("@#{attr}", val)
        end
    end

    def to_hash
        result = {}
        self.class.serializable_attrs.each do |attr, target|
            if target != nil then
                result[target] = instance_variable_get("@#{attr}")
            end
        end
        return result
    end
end

用法示例:

class AuthRequest < Serializable
    serialize :company_id,      'companyId'
    serialize :private_key,     'privateKey'
end

1 个答案:

答案 0 :(得分:1)

类实例变量不是继承的,所以行

@serializable_attrs = {}

仅在Serializable中设置它而不是它的子类。虽然您可以使用继承的钩子在子类化上设置它,或者更改serialize方法以初始化@serializable_attrs我可能会添加

def self.serializable_attrs
  @serializable_attrs ||= {}
end

然后使用它而不是直接引用实例变量。