Начальное значение для переменной экземпляра класса в цепочке наследования - PullRequest
0 голосов
/ 09 апреля 2020

Я хочу сохранить отдельные значения для каждого класса вместе с его унаследованными классами и хочу, чтобы эти значения изначально были []. Поэтому я подумал об использовании переменных класса экземпляра, поскольку они не являются общими для всей цепочки наследования:

module Foo
  def self.included(base)
    base.class_eval do
      @foos = []
    end

    base.extend ClassMethods
  end

  module ClassMethods
    attr_reader :foos
  end
end

, который я включаю в другой класс, имеющий дочерние классы

class Bar
  include Foo
end

class Baz < Bar
end

Bar.foos        # []
Baz.foos        # nil

Итак, мой вопрос Каков наилучший способ иметь значение Baz.foos, чтобы изначально [] вместо nil динамически без открытия дочернего класса?

Я пытался использовать переменные класса вместо переменных класса экземпляра, но тогда все классы будут совместно использовать одну и ту же копию переменной класса @@foos

Спасибо

1 Ответ

2 голосов
/ 10 апреля 2020

Хотя предложение @Stefan в комментариях, вероятно, является способом go, это все же возможно при метапрограммировании; нужно всего лишь обработать наследование .

module Foo
  def self.included(base)
    base.class_eval { @foos = [] }
    class << base
      attr_reader :foos
      def inherited(other)
        Foo.included(other)
      end
    end
  end
end

class Bar
  include Foo
end

class Baz < Bar; end

Bar.foos #⇒ []
Baz.foos #⇒ []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...