キュー(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始めてまだ日が浅いので他の方法もあるかもしれません。
もし他に方法があれば教えていただきたいです!