LoginSignup
2
1

More than 5 years have passed since last update.

【Ruby】Queueの中身を参照する

Last updated at Posted at 2015-06-28

キュー(Queue)って今中身はどんな状態か参照するアクセサとか用意されてないみたいですね。
でも参照したいことってありますよね。

やってることはクラス継承でアクセサ(attr_reader)を追加しただけです。
デバッグに役に立ったのでメモメモ。

QueueRef.rb
class RefQueue < Queue
  attr_reader :que
end

defQue = Queue.new
refQue = RefQueue.new

i = 0
defQue.push( i += 1 ) while 10 > defQue.length 
refQue.push( i += 1 ) while 10 > refQue.length 

p defQue.que # -> undefined method `que'
p refQue.que # -> [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

ちなみに、p defQueでも中身は見れますが、色々余計な物も表示されるのでこっちの方が綺麗だと思います。

attr_accessor,attr_writerは止めた方がいいかも*

というのも、pushとか使わずにQueueの中身を変えると、Threadの挙動に影響が出るかもしれません。
Queueが空でsleep中のThreadに対して、attr_writerで値を入れてsleepが解除されるか分かりませんし。
まぁそもそも、新しい要素を追加するだけならpushでいいですし、Queueの途中に要素を追加する必要があるということは、そもそもQueueじゃなくて普通のArrayオブジェクトで実装した方が良いのかもしれませんし。
そんな理由もあって、検証する気もないので触らぬ神ですね。

* 追記
attr_readerを設定したインスタンス変数も破壊的に変更できるそうです。
詳細はコメントを参照してください。

私事

継承を活用したのは初めてかも。
標準クラスって機能が足りないって思うことが基本的に無いですしね。

Ruby始めてまだ日が浅いので他の方法もあるかもしれません。
もし他に方法があれば教えていただきたいです!

2
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1