我发现这种基于委托整齐的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