Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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を使用します クラス。

読んでくれてありがとう。 🙂


  1. Rubyエイリアスキーワードの使用方法

    Rubyメソッドに別の名前を付けるには、次の2つの方法があります。 エイリアス(キーワード) alias_method 彼らはわずかに異なる方法で同じことをするので、これは紛らわしいトピックになる可能性があります。 この画像は違いの要約です : しっかりと理解するために、これらの違いをさらに詳しく調べてみましょう! エイリアスキーワード まず、aliasがあります 、これはRubyキーワードです(ifなど) 、def 、class 、など) このように見えます : alias print_something puts print_something 1 prin

  2. RubyでStructとOpenStructを使用する方法

    Rubyの構造体とは何ですか? 構造体は組み込みのRubyクラスであり、値オブジェクトを生成する新しいクラスを作成するために使用されます。値オブジェクトは、関連する属性を一緒に格納するために使用されます。 ここに例があります : Point 2つの座標(x &y 。 このデータはさまざまな方法で表すことができます。 いいね : 配列[10, 20] ハッシュ{ x: 10, y: 10 } オブジェクトPoint.new(10, 20) 複数のPointを使用する場合 、オブジェクトアプローチを使用することをお勧めします。 しかし… これら2つの値を一緒に格納するた