在下面的茶水计时器代码中,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