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
然后使用它而不是直接引用实例变量。
依托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
然后使用它而不是直接引用实例变量。