Ruby 2.5.0 リファレンスマニュアル > ライブラリ一覧 > observerライブラリ > Observableモジュール

module Observable

クラス・モジュールの継承リスト: Observable

要約

Observer パターンを提供するモジュールです。

Mix-in により Observer パターンを提供します。

Observable モジュールを include したクラスは Observable#changed メソッドにより更新フラグを立て、 Observable#notify_observers が呼び出されると更新フラグが立っている場合はオブザーバに通知します (オブザーバの update メソッドを呼び出す)。 Observable#notify_observers の引数はそのままオブザーバの update メソッドに渡されます。

サンプルコード

require "observer"

class Ticker          ### Periodically fetch a stock price.
  include Observable

  def initialize(symbol)
    @symbol = symbol
  end

  def run
    last_price = nil
    loop do
      price = Price.fetch(@symbol)
      print "Current price: #{price}\n"
      if price != last_price
        changed                 # notify observers
        last_price = price
        notify_observers(Time.now, price)
      end
      sleep 1
    end
  end
end

class Price           ### A mock class to fetch a stock price (60 - 140).
  def self.fetch(symbol)
    60 + rand(80)
  end
end

class Warner          ### An abstract observer of Ticker objects.
  def initialize(ticker, limit)
    @limit = limit
    ticker.add_observer(self)
  end
end

class WarnLow < Warner
  def update(time, price)       # callback for observer
    if price < @limit
      print "--- #{time.to_s}: Price below #@limit: #{price}\n"
    end
  end
end

class WarnHigh < Warner
  def update(time, price)       # callback for observer
    if price > @limit
      print "+++ #{time.to_s}: Price above #@limit: #{price}\n"
    end
  end
end

ticker = Ticker.new("MSFT")
WarnLow.new(ticker, 80)
WarnHigh.new(ticker, 120)
ticker.run

# => Current price: 126
# => +++ 2017-11-02 12:09:36 +0900: Price above 120: 126
# => Current price: 102
# => Current price: 87
# => Current price: 121

インスタンスメソッド

定義 説明
add_observer(observer, func=:update) -> Array

オブザーバを登録します。

changed(state = true) -> bool

更新フラグを立てます。

changed? -> bool

更新フラグの状態を返します。

count_observers -> Integer

登録されているオブザーバの数を返します。

delete_observer(observer) -> object | nil

オブザーバを削除します。

delete_observers -> Array

オブザーバをすべて削除します。

notify_observers(*arg) -> nil

オブザーバへ更新を通知します。