Ошибка при добавлении наблюдателя в Ruby - PullRequest
0 голосов
/ 03 августа 2011

Я использую Ruby 1.9.2, и у меня есть класс, который использует mixin наблюдателя:

require 'observer'

class Street
  include Observable

  attr_accessor :current

  def initialize current
    @current = current
  end

  def reset
    @current = :preflop
  end

  def receive street
    @current = street
    changed  
    notify_observers
  end

end

Но когда я пытаюсь добавить наблюдателя, например:

  def initialize  
    @street = Street.new(:preflop)
    @stats = Stats.new 
    @street.add_observer(@stats)
  end

Я получаю эту ошибку:

 can't convert nil into Integer (TypeError)

Что происходит в последней строке add_observer:

  def add_observer(observer, func=:update)
    @observer_peers = {} unless defined? @observer_peers
    unless observer.respond_to? func
      raise NoMethodError, "observer does not respond to `#{func.to_s}'"
    end
    @observer_peers[observer] = func
  end

РЕДАКТИРОВАТЬ: это оказалось проблемой с моим attr_accessor для переменной с именем (erm) @hash Видимо, был какой-то конфликт с наблюдаемым миксином.

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Вставил код в irb под ruby ​​1.9.2-p180 и набрал

Something.new

Казалось бы, работа. Вернулся:

<Something:0x00000100ac9238 @street=#<Street:0x00000100ac9210 @current=:preflop, @observer_peers={#<Stats:0x00000100ac91e8 @stats="hey">=>:update}>, @stats=#<Stats:0x00000100ac91e8 @stats="hey">>

Не утверждая, что это имеет какое-либо отношение к реальности или синатре. Просто запустите некоторый код в irb, чтобы увидеть, получит ли он ту же ошибку, чего не было. Рявкнул о том, что не отвечает на обновление, поэтому я вставил это.

Вот код:

require 'observer'

class Street
  include Observable

  attr_accessor :current

  def initialize current
    @current = current
  end

  def reset
    @current = :preflop
  end

  def receive street
    @current = street
    changed
    notify_observers
  end
end

class Stats
  def initialize
    @stats = 'hey'
  end

  def update
    @stats = 'ho'
  end
end

class Something
  def initialize
    @street = Street.new( :preflop )
    @stats = Stats.new
    @street.add_observer( @stats )
  end
end
0 голосов
/ 04 августа 2011

оказалось, что у меня есть attr_accessor для переменной с именем (erm) @hashПо-видимому, был некоторый конфликт с наблюдаемым миксином.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...