我想要个孩子类继承其父类级别的实例变量,但我似乎无法弄清楚。 基本上,我正在寻找这样的功能:
class Alpha
class_instance_inheritable_accessor :foo #
@foo = [1, 2, 3]
end
class Beta < Alpha
@foo << 4
def self.bar
@foo
end
end
class Delta < Alpha
@foo << 5
def self.bar
@foo
end
end
class Gamma < Beta
@foo << 'a'
def self.bar
@foo
end
end
然后,我想这是这样的输出:
> Alpha.bar
# [1, 2, 3]
> Beta.bar
# [1, 2, 3, 4]
> Delta.bar
# [1, 2, 3, 5]
> Gamma.bar
# [1, 2, 3, 4, 'a']
显然,这个代码不起作用。 基本上,我想定义在父类中的一类级别的实例变量,它的子类继承的默认值。 子类中的变化将是默认值,那么对于一个子子类。 我想这一切都没有影响其父母或兄弟姐妹一类的价值的变化发生。 Class_inheritable_accessor给人正是我想要的行为......但对于一个类变量。
我觉得我可能会问太多。 有任何想法吗?
Use a mixin:
module ClassLevelInheritableAttributes
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def inheritable_attributes(*args)
@inheritable_attributes ||= [:inheritable_attributes]
@inheritable_attributes += args
args.each do |arg|
class_eval %(
class << self; attr_accessor :#{arg} end
)
end
@inheritable_attributes
end
def inherited(subclass)
@inheritable_attributes.each do |inheritable_attribute|
instance_var = "@#{inheritable_attribute}"
subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
end
end
end
end
包括此模块中的一类,赋予其二级方法:inheritable_attributes和继承。
继承的类方法的工作原理相同,如图所示模块中的self.included方法。 当包括该模块类的子类得到,它设置一个类级别的实例变量对每个声明的类级继承实例变量(@inheritable_attributes)的。
Rails已经这个内置的框架作为调用的方法class_attribute 。 你总是可以检查出该法源 ,使自己的版本或复制逐字。 要留意的唯一的事情是,你不改到位的可变项 。
我在我的项目没有使用resque是定义一个基础
class ResqueBase
def self.inherited base
base.instance_variable_set(:@queue, :queuename)
end
end
在其他的子作业,队列实例将被默认设置。 希望它可以帮助。