Я нашел этот аккуратный доверителя на основе «тройник» реализации на SO:переменной экземпляра в методе класса
https://stackoverflow.com/a/6410202/2379703
И мне очень интересно, что это значит для @targets (переменная экземпляра) означает в контексте метода класса:
require 'logger'
class MultiDelegator
def initialize(*targets)
@targets = targets
end
def self.delegate(*methods)
methods.each do |m|
define_method(m) do |*args|
@targets.map { |t| t.send(m, *args) }
end
end
self
end
class <<self
alias to new
end
end
log_file = File.open("debug.log", "a")
log = Logger.new MultiDelegator.delegate(:write, :close).to(STDOUT, log_file)
Я понимаю, что это определение методов записи/закрытия, но @targets даже не определена в этой точке, так как .TO (псевдоним нового) до сих пор не называется, так что я бы Предположим, что @targets равно нулю.
Можно ли дать объяснение относительно логистики того, как работает этот код? Неужели рубин даже не пытается получить доступ/разрешить @targets до тех пор, пока не будет вызван тот метод, который будет вызван регистратором после его создания?
Ahh define_method определяет метод экземпляра, несмотря на то, что он вызван в методе класса. Я читаю немного больше, и кажется, что instance_eval используется под обложками, поэтому я вижу, как @targets - это переменная экземпляра вызывающего экземпляра. – jshort