次のティータイマーコードには、SleepTimer内に「notify」を呼び出す「start」メソッドがあります。
def start
sleep minutes * 60
notifier.notify("Tea is ready!")
end
以下のコードを見ると、に通知メソッドがあり、に通知メソッドがあることがわかりclass StdioUi
ますmodule UiWithBeep
。上記のstartメソッドは、のnotifyメソッドを呼び出しますmodule UiWithBeep
。次に、'super'を介して、のnotifyメソッドを呼び出しますclass StdioUi
。module UiWithBeep
(効果は、「お茶の準備ができました」の前に「BEEP!」が聞こえるということです。)しかし、notifier.notifyがnotifyメソッドをではなくで呼び出す理由がわかりません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