Шаблон Observer не работает на Ruby

Я реализовал этот пример ниже для использования шаблона Observer на 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

ОБНОВИТЬ

Я преобразовал модуль AnObserver в класс, как это:

class AnObserver

  def update constant
    $stdout.puts "Constant #{constant} has been called."
  end

end

И поменять класс AAnyClass добавив Observable методы в конструктор и передача AnObserver экземпляр как параметр метода 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

Вот и все.

1 ответ

Я думаю, что вы используете модули и "расширяет", где вы должны использовать классы и "включает". Примерно так может быть то, что вы ищете:

require "observer"

class AAnyClass
  include Observable

  def run
    changed
    notify_observers(self)
  end
end

class AnObserver

  def initialize(ob)
    ob.add_observer(self)
  end

  def update constant
    p "Constant #{constant} has been called."
  end

  def observe constant
    constant.add_observer(constant)
  end

end

ob = AAnyClass.new
AnObserver.new ob
ob.run
Другие вопросы по тегам