父类';Ruby中的s实例变量
因此,无论出于什么原因,ruby核心队列类中都没有peek方法。我正在尝试创建一个实现peek方法的子类。然而,我不明白为什么我会出错。不可能以这种方式使用实例变量吗?查看Queue的源代码,父类的构造函数中有实例变量。有没有办法在子类中引用这些父类';Ruby中的s实例变量,ruby,oop,Ruby,Oop,因此,无论出于什么原因,ruby核心队列类中都没有peek方法。我正在尝试创建一个实现peek方法的子类。然而,我不明白为什么我会出错。不可能以这种方式使用实例变量吗?查看Queue的源代码,父类的构造函数中有实例变量。有没有办法在子类中引用这些 class PeekQueue < Queue def peek @mutex.synchronize{ while true if @que.empty? raise ThreadEr
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
类队列
编辑:队列类是在编译时创建的,这就是为什么我在github上的ruby源代码中找不到源代码的原因。这是父类的外观:
我没有看到这个错误:
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
irb(main):025:0>qq=PeekQueue.new
=> #
irb(main):026:0>qq.peek
NameError:未定义的局部变量或方法“non_block”#
发自(irb):15:in'block in peek'
from(irb):12:in“synchronize”
来自(irb):12:in'peek'
来自(irb):26
from/usr/bin/irb:12:in`'
irb(main):027:0>qq.push 1
=> #
irb(main):028:0>qq.peek
=> 1
方法#非#块似乎是一个问题。但是对@mutex的访问与您的代码配合使用。我不熟悉
Queue
类,但是您尝试过,Queue=Queue.new;enum=queue.to_enum#=>#
next
和peek
当然会响应枚举数。未定义的方法'each'for#您在哪里定义@mutex?这似乎是零。您正在查看的队列的源代码在哪里?在ruby doc站点上,我看到一个C实现,它似乎没有定义@mutex。如果这是您正在使用的队列
,则不会出错。但正如@jbeck所指出的,这并不是MRI核心的样子。