Ruby中父类的实例变量

时间:2015-02-23 02:45:53

标签: ruby oop

因此,无论出于何种原因,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

1 个答案:

答案 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适用于您的代码。