【发布时间】:2015-02-23 02:45:52
【问题描述】:
因此,无论出于何种原因,ruby 核心 Queue 类中都没有 peek 方法。我正在尝试创建一个实现 peek 方法的子类。但是,我不明白为什么会出现错误。不能以这种方式使用实例变量吗?查看Queue的源码,在父类的构造函数中有实例变量。有没有办法在子类中引用这些?
class PeekQueue < Queue
def peek
@mutex.synchronize{
while true
if @que.empty?
raise ThreadError, "queue empty" if non_block
@waiting.push Thread.current
@mutex.sleep
else
return @que[0]
end
end
}
end
end
a = PeekQueue.new
a.push(1)
a.peek
NoMethodError: undefined method 'synchronize' for nil:NilClass
编辑:Queue 类是在编译时创建的,这就是为什么我在 github 上的 ruby 源代码上找不到源代码的原因。这是父类的样子: https://gist.github.com/anonymous/574e20fea3a28663bfe2
【问题讨论】:
-
我不熟悉
Queue类,但你试过queue = Queue.new #=> #<Thread::Queue:0x007fe3e401c898>; enum = queue.to_enum #=> #<Enumerator: #<Thread::Queue:0x007fe3e401c898>:each>吗?next和peek当然会响应枚举数。 -
#<:queue:0x007f85f298d760> 的未定义方法 `each'
-
你在哪里定义@mutex?这似乎是零
-
您正在查看的 Queue 的源代码在哪里?在 ruby-doc 网站上,我看到了一个似乎没有定义 @mutex 的 C 实现。
-
如果您使用的是
Queue,it works 不会出错。但正如@jbeck 所说,这不是 MRI CoreQueueclass 的样子。