我發現這種基於委託整齊的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甚至沒有在自。要(化名到新)這個點定義還有待所謂的我假設@targets爲零。
任何人都可以解釋這個代碼的工作原理嗎?在嘗試調用有問題的方法之前,ruby是否甚至不嘗試訪問/解析@targets,在實例化之後它將由記錄器進行調用?
Ahh define_method定義了一個實例方法,儘管在類方法中被調用。我讀了更多,似乎在封面下使用了instance_eval,所以我看到@targets是如何調用實例的實例變量。 – jshort