我使用的是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来说是一个问题。显然,与可观察的混合有一些冲突。
答案 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来说是一个问题。显然,与可观察的混合有一些冲突。