Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
父类';Ruby中的s实例变量_Ruby_Oop - Fatal编程技术网

父类';Ruby中的s实例变量

父类';Ruby中的s实例变量,ruby,oop,Ruby,Oop,因此,无论出于什么原因,ruby核心队列类中都没有peek方法。我正在尝试创建一个实现peek方法的子类。然而,我不明白为什么我会出错。不可能以这种方式使用实例变量吗?查看Queue的源代码,父类的构造函数中有实例变量。有没有办法在子类中引用这些 class PeekQueue < Queue def peek @mutex.synchronize{ while true if @que.empty? raise ThreadEr

因此,无论出于什么原因,ruby核心队列类中都没有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
类队列
编辑:队列类是在编译时创建的,这就是为什么我在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核心的样子。