Ruby class subclasses 中的实例变量

Ruby class instance variables in subclasses

依托this answer,写了下面class。使用时出现错误:

in 'serialize': undefined method '[]=' for nil:NilClass (NoMethodError).

如何访问基数 class 中的变量 @serializable_attrs

基础class:

# 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

Class实例变量不被继承,所以行

@serializable_attrs = {}

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

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

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