继承Ruby类级的实例变量?(Inherit class-level instance variab

2019-06-24 17:54发布

我想要个孩子类继承其父类级别的实例变量,但我似乎无法弄清楚。 基本上,我正在寻找这样的功能:

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给人正是我想要的行为......但对于一个类变量。

我觉得我可能会问太多。 有任何想法吗?

Answer 1:

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)的。



Answer 2:

Rails已经这个内置的框架作为调用的方法class_attribute 。 你总是可以检查出该法源 ,使自己的版本或复制逐字。 要留意的唯一的事情是,你不改到位的可变项 。



Answer 3:

我在我的项目没有使用resque是定义一个基础

class ResqueBase
  def self.inherited base
    base.instance_variable_set(:@queue, :queuename)
  end
end

在其他的子作业,队列实例将被默认设置。 希望它可以帮助。



文章来源: Inherit class-level instance variables in Ruby?