Rubyでオブザーバーパターンを使用するために、以下の例を実装しました。私はthisに従ってみましたが、うまくいきませんでした。Rubyでオブザーバーパターンが機能しない
require "observer"
class AAnyClass
extend Observable
changed
notify_observers self
end
module AnObserver
extend self
def update constant
p "Constant #{constant} has been called."
end
def observe constant
constant.add_observer(self)
end
end
AnObserver.observe AAnyClass
# must return "Constant AAnyClass has been called."
AAnyClass
# must return "Constant AAnyClass has been called."
AAnyClass
UPDATE私はこのように、クラスにモジュールAnObserver
変換
:
class AnObserver
def update constant
$stdout.puts "Constant #{constant} has been called."
end
end
およびコンストラクタにObservable
メソッドを追加としてAnObserver
インスタンスを渡すクラスAAnyClass
を変更しますパラメータadd_observer
へのパラメータ:
class AAnyClass
include Observable
def initialize
add_observer AnObserver.new
changed
notify_observers AAnyClass
end
end
最後に、eigenclass
のAAnyClass
をAAnyClass’s
コンストラクタの同じコードで変更する小さなコードを追加しました。
class << AAnyClass
extend Observable
add_observer AnObserver.new
changed
notify_observers AAnyClass
end
AAnyClass
AAnyClass.new
AAnyClass.new
これだけです。
あなたのコードは、解析段階(クラスが宣言されているとき)で 'notify_observers'を一度呼びます。パターンは動作しない/動作しません。コードはできます。 – mudasobwa
「AAnyClass」が呼ばれたことを知るための方法がいくつかありますか? '' Module'''の '' included''メソッドの使い方。 – rplaurindo