在Ruby中添加观察者时出错

时间:2011-08-02 22:45:24

标签: ruby sinatra

我使用的是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
编辑:这对于我在名为(erm)@hash的变量上有一个attr_accessor来说是一个问题。显然,与可观察的混合有一些冲突。

2 个答案:

答案 0 :(得分:1)

在ruby 1.9.2-p180下的irb中粘贴代码并键入

  

Something.new

似乎工作。回来了:

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

并未声称这与现实或sinatra有任何关系。只需在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

答案 1 :(得分:0)

这对于我在名为(erm)@hash的变量上有一个attr_accessor来说是一个问题。显然,与可观察的混合有一些冲突。

相关问题