因此,无论出于何种原因,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
答案 0 :(得分:0)
我没有看到错误:
irb(main):025:0> qq = PeekQueue.new
=> #<PeekQueue:0x000006002bf498 @que=[], @num_waiting=0, @mutex=#<Mutex:0x000006002bf420>, @cond=#<ConditionVariable:0x000006002bf3f8 @waiters={}, @waiters_mutex=#<Mutex:0x000006002bf3a8>>>
irb(main):026:0> qq.peek
NameError: undefined local variable or method `non_block' for #<PeekQueue:0x000006002bf498>
from (irb):15:in `block in peek'
from (irb):12:in `synchronize'
from (irb):12:in `peek'
from (irb):26
from /usr/bin/irb:12:in `<main>'
irb(main):027:0> qq.push 1
=> #<ConditionVariable:0x000006002bf3f8 @waiters={}, @waiters_mutex=#<Mutex:0x000006002bf3a8>>
irb(main):028:0> qq.peek
=> 1
方法#non_block似乎是一个问题。但访问@mutex适用于您的代码。