キューはアイテムのコレクションを持つ線形データ構造です。RobloRoblox(ロブロックス) には 2種類のキューがあります: 定期的なキュー 、これは最初に入って最初に出る (FIFO) 原則に従い、および 優先順位のあるキュー 、これはキュー内のアイテムに対するデータへのアクセス順序を決定する優先順位を持っています。両方の種類のキューにあるアイテムは、すべて Luau データタイプ であることができます。
キューは、非永続データストレージ サービスの内蔵データ構造であり、内蔵機能を直接呼び出してキューを取得し、追加、既読み込み、または削除し、キューからデータを削除できます。スケジュールタスクのスケジューリングやエクスペリエンス内のリクエストの処理など、他の用途では、テーブルを使用して独所有のキューを実装できます。
レギュラーキュー
通常のキューは、FIFO シーケンスで維持され、すべてのアイテムがキューの後ろに追加され、前から後ろに同じ順序で読み込まれたり削除されたりします。

優先順位のキュー
優先順位のキューは、順番が読まれたり削除されたことを示す優先順位番号で各アイテムを追加できる FIFO ルールに従っていません。優先順位のキューの後ろにあるアイテムは、デフォルトの優先順位が 0 であり、キューの前にあるアイテムは、次の例で 5 の最高設定優先度があります。

この例では、優先度 3 の設定があるアイテムがキューに追加されています。キューは、設定された優先度 3 以上のすべての既存のアイテムの後ろに新しいアイテムを配置します。キューの前にアイテムを配置するには、現在の最高設定優先度より高い優先度を設定する必要があります。この例では、優先度を 6 以上に設定する必要があります。
優先順位のキューは、追加順序ではなく重要度順序に基づいてデータを読んだりアクセスしたい状況に便利です。アイテムを追加するときに整数として優先度を設定でき、優先度の低いアイテムよりも先にキュープロセスがアイテムを処理できます。たとえば、長時間待機しているユーザーに高い優先度を割り当てて、マッチメイキングのための優先順位のキューを使用できます。
キューを実装
内蔵のキュー MemoryStoreService または テーブル を使用して、すべての他の使用のためのキューを実装できます。次のコードサンプルでは、実装が 普通のキュー を示しています。この実装をエクスペリエンスに使用するには、ModuleScript として保存し、ReplicatedStorage に保存して、クライアントとサーバーの両方にアクセスできるようにします。
テーブルを使用して定期的なキューを実装する
--!厳格な
local Queue = {}
Queue.__index = Queue
export type Queue<T> = typeof(setmetatable(
{} :: {
_first: number,
_last: number,
_queue: { T },
},
Queue
))
function Queue.new<T>(): Queue<T>
local self = setmetatable({
_first = 0,
_last = -1,
_queue = {},
}, Queue)
return self
end
-- キューが空かどうかをチェックする
function Queue.isEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- キューに値を追加する
function Queue.enqueue<T>(self: Queue<T>, value: T)
local last = self._last + 1
self._last = last
self._queue[last] = value
end
-- キューから値を削除する
function Queue.dequeue<T>(self: Queue<T>): T
if self:isEmpty() then
error("Cannot dequeue from empty queue")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue
次のコードサンプルは、 の下での使用例です。以前の実装コードサンプルを適切に保存している限り、コード、入力イプ、およびストレージの場所を自分の使用に合わせて変更できます。
普通のキュー使用例
local ReplicatedStorage = game:GetService("ReplicatedStorage")local Queue = require(ReplicatedStorage:WaitForChild("Queue"))local myQueue = Queue.new()-- キューに値をいくつか追加するmyQueue:enqueue(5)myQueue:enqueue(10)myQueue:enqueue(15)-- myQueue = { 5、10、15}-- キューから 1 つの値を削除local first = myQueue:dequeue()print("The first value added to the queue was", first)-- myQueue = { 10、15}-- キューにより多くの値を追加するmyQueue:enqueue(20)myQueue:enqueue(25)myQueue:enqueue(30)-- myQueue = { 10、15、20、25、30 }-- キューから別の値を削除するlocal second = myQueue:dequeue()print("The second value added to the queue was", second)-- myQueue = { 15, 20, 25, 30 }