在下面的茶水计时器代码中,SleepTimer 中有一个“start”方法,它调用“notify”。
def start
sleep minutes * 60
notifier.notify("Tea is ready!")
end
如果您查看下面的代码,您会发现 中有一个 notify 方法class StdioUi以及module UiWithBeep. 上面显示的 start 方法调用 in 中的 notify 方法module UiWithBeep,然后通过 'super' 调用 in 中的 notify 方法class StdioUi。(效果是在“Tea is ready”之前听到“BEEP!”。)但是,我不明白为什么 notifier.notify 调用 notify 方法是 inmodule UiWithBeep而不是 in class StdioUi。
第一个问题:它如何知道去一个“通知”而不是另一个。
SecondQuestion而且,虽然我理解超级,但建立关系以便通知class StdioUi对另一个通知是“超级”的。你能解释一下吗
茶计时器
class TeaClock
attr_accessor :timer
attr_accessor :ui
def initialize(minutes)
self.ui = StdioUi.new
self.timer = SleepTimer.new(minutes, ui)
init_plugins
end
def init_plugins
puts "init plugins"
@plugins = []
::Plugins.constants.each do |name|
@plugins << ::Plugins.const_get(name).new(self)
end
end
def start
timer.start
end
end
class StdioUi
def notify(text)
puts text
end
end
SleepTimer = Struct.new(:minutes, :notifier) do
def start
sleep minutes * 60
notifier.notify("Tea is ready!")
end
end
module Plugins
class Beep
def initialize(tea_clock)
tea_clock.ui.extend(UiWithBeep)
end
module UiWithBeep
def notify(*) #gets called by notifier.notify("Tea is ready")
puts "BEEP!"
super #calls notify in class StdioUi
end
end
end
end
t = TeaClock.new(0.01).start