Rubyでキューを使用する方法
キューは順番待ちリストのようなものです。
最新のApple製品を購入したり、映画のチケットを入手したり、食料品の代金を支払ったりするために並んで待っていると想像してみてください。
これらはキューです!
Rubyプロジェクトでキューを使用できます。
どのように?
キューを使用すると、到着順に処理できるため、待機時間が長くなるほど優先順位を付ける必要がある場合に役立ちます。
これを適用できます :
- 実際のキューをモデル化する
- 幅優先探索(BFS)などのアルゴリズムを実装する
- CPU、ディスク、プリンタなどの共有リソースへのアクセスを制御します。
今…
コードを見てみましょう!
Rubyでキューを実装する方法
配列はQueue
のように動作できます 適切な方法を使用すれば。
これらの方法は :
unshift
(またはprepend
Ruby 2.5以降を使用)-
pop
unshift
するとき 、キューに1つのアイテムを追加しています。
例 :
queue = [] queue.unshift "apple" queue.unshift "orange" queue.unshift "banana" # ["banana", "orange", "apple"]
pop
するとき 、キューから最後のアイテムを削除します。
これは次に処理する必要があるアイテムです。
例 :
queue.pop # "apple" queue.pop # "orange"
最後のアイテムを見て、このアイテムを削除せずに「次の人」を確認できます。
例 :
queue[-1] # "banana"
この操作はpeek
と呼ばれます 。
Ruby並行キュー
Rubyには、適切なスレッドセーフなブロッキングQueue
があります。 クラス。
このキューを使用して、マルチスレッドプログラムでの作業を調整できます。
例 :
que = Queue.new que << 1 que << 2 que << 3
pop
を使用して、このキューからアイテムを取得できます :
que.pop # 1 que.pop # 2
キューが空の場合は、pop
を呼び出します 現在のスレッドをスリープ状態にし、キューに何かが追加されるまで待機します 。
それが「ブロック」の意味です。
true
を渡すことで、ブロックを回避できます pop
へ :
que.pop(true)
これにより、ThreadError: queue empty
が発生します キューが空の場合の例外。
サイズ変更されたキューの使用方法
サイズ設定されたキューは通常のキューと同じですが、サイズに制限があります。
例 :
que = SizedQueue.new(5)
キューがいっぱいになると、push
(<<
と同じ )操作は、アイテムがキューから削除されるまで現在のスレッドを一時停止します。
例 :
que.push(:bacon)
代わりに、true
を渡して、例外を発生させることを選択できます。 引数として:
que.push(:bacon, true)
これにより、ThreadError: queue full
が発生します 。
ビデオチュートリアル
概要
Rubyキューについて学びました!
作業をFIFO(先入れ先出し)順で処理する必要がある場合は、キューを使用できます。 。 キューを実装するには2つの方法があります 、配列を使用するか、Queue
を使用します クラス。
読んでくれてありがとう。 🙂
-
Rubyエイリアスキーワードの使用方法
Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin
-
RubyでStructとOpenStructを使用する方法
Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた