Я думал, что сделаю микширование для регистрации, чтобы сохранить мой код DRY. Вот как это выглядит:Можно ли смешивать до вызова конструктора?
# Mixin that provides shortcuts for logging methods.
module Logging
def self.included(base)
base.class_exec {
@logger_name = base.to_s
@subloggers = []
@logger = Logger.new(STDOUT)
@logger.level = Logger::FATAL
}
end
def logger=(logger)
@logger = logger
@subloggers.each { |obj| obj.logger = logger }
end
def debug(&block)
@logger.debug(@logger_name, &block)
end
def info(&block)
@logger.info(@logger_name, &block)
end
def warn(&block)
@logger.warn(@logger_name, &block)
end
def error(&block)
@logger.error(@logger_name, &block)
end
def fatal(&block)
@logger.fatal(@logger_name, &block)
end
end
В теории, я должен теперь быть в состоянии сделать это:
class SomeClass
include Logging
def foo_bar
debug { "foo_bar is being executed" }
fatal { "IT'S A TRAP" }
end
end
Проблема заключается в том, что, по-видимому initialize
называется до в Примеси включены, в результате чего это для отказа:
class SomeClass
include Logging
def initialize
@cache = CacheClass.new
@subloggers << @cache # @subloggers is nil
end
end
И я не могу изобразить вокруг него никакой возможности. Я всегда создаю свои зависимости в конструкторе, и мне нужно, чтобы в этот момент был доступен Mixing Logging. Есть идеи?
Любой способ сделать то, что я пытаюсь добиться? – Hubro
Если эти переменные должны быть разделены между экземплярами, вы должны определить их как переменные класса или переменные экземпляров в классе. Если вы хотите, чтобы каждый экземпляр имел разные переменные, вам нужно поместить его в конструктор. – sawa
Итак, нет способа, чтобы mixin определял переменные экземпляра. – Hubro