Ruby: сохранение значения во время включения

В классе Ruby я хотел бы сохранить значение переменной в тот момент, когда она включает данный модуль. Ниже надуманный пример:

module M
  def self.included(base)
    base.class_eval do
      @@inclusion_time = Time.now

      def included_at
        @@inclusion_time
      end
    end
  end
end

class A
  include M
end

sleep 3

class B
  include M
end

sleep 3

class C
  include M
end

a = A.new
b = B.new
c = C.new

puts a.included_at
puts b.included_at
puts c.included_at

Я пробовал это разными способами (attr_accessor, set_constant и т. д.), но конечный результат всегда один и тот же. Все классы имеют то значение, которое было установлено последним.

Как мне обойти это?


person Yes - that Jake.    schedule 13.12.2013    source источник


Ответы (1)


person    schedule
comment
Когда я заменяю модуль SO M вашим, A.new.included_at возвращает nil (конечно, то же самое для B и C), тогда как def self.included(klass) klass.instance_variable_set(:@inclusion_time, Time.now) end дает желаемый результат. Обратите внимание, что внутри self.included self равно M. - person Cary Swoveland; 13.12.2013