キューは、アイテムのコレクションを持つ線形データ構造です。Roblox には 2 種類のキューがあります: 通常のキュー(先入れ先出し (FIFO) の原則に従う)と、優先度キュー(キュー内のアイテムに優先度が設定され、その優先度に基づいてデータのアクセス順序が決まる)です。両方のタイプのキューのアイテムは、任意の Luau データ型 であることができます。
キューは、MemoryStoreService という非永続データストレージの組み込みデータ構造で、内蔵関数を直接呼び出してキューを取得し、データを追加、読み取り、または削除することができます。タスクのスケジューリングやゲーム内リクエストの処理など、他の用途には、テーブルを使用して独自にキューを実装することができます。
通常のキュー
通常のキューは FIFO シーケンスで維持され、すべてのアイテムはキューの後ろに追加され、追加された順に前から後ろへ読み出されます。

優先度キュー
優先度キューは FIFO ルールに従わず、各アイテムは読み取りまたは削除される順序を示す優先度番号を持つことができます。優先度キューの後ろにあるアイテムの既定の優先度は 0 で、キューの前にあるアイテムの優先度は最も高いものであり、以下の例では 5 に設定されています。

この例では、優先度が 3 のアイテムがキューに追加されます。キューは新しいアイテムを既存のアイテムで設定された優先度が 3 以上のものの後ろに配置します。アイテムをキューの前に置くには、現在の最も高い設定された優先度よりも高い優先度を設定する必要があります。この例では、優先度を 6 以上に設定する必要があります。
優先度キューは、追加された順序ではなく、重要度の順序に基づいてデータを読み取ったりアクセスしたりしたい場合に便利です。アイテムを追加するときに優先度を整数として設定でき、キューは低い優先度のアイテムの前に高い優先度のアイテムを処理します。たとえば、長時間待機しているユーザーに高い優先度を割り当てることで、マッチメイキングに優先度キューを使用できます。
キューを実装する
MemoryStoreService の組み込みキューを使用するか、テーブル を使用して他の用途のキューを実装できます。以下のコードサンプルは、通常のキューの実装を示しています。この実装をゲームで使用するには、ModuleScript として保存し、ReplicatedStorage に格納する必要があります。これにより、キューはクライアントとサーバーの両方からアクセス可能になります。
テーブルを使用した通常のキューの実装
--!strict
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("空のキューからはデキューできません")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue
以下のコードサンプルは、Workspace の下での Script としての使用例です。このコード、タイプ、および保存位置を独自の使用に合わせて変更できます。前の実装コードサンプルが適切に保存されていれば問題ありません。
通常のキュー使用例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("キューに追加された最初の値は", first)-- myQueue = { 10, 15 }-- キューにさらに値を追加するmyQueue:enqueue(20)myQueue:enqueue(25)myQueue:enqueue(30)-- myQueue = { 10, 15, 20, 25, 30 }-- キューから別の値を削除するlocal second = myQueue:dequeue()print("キューに追加された 2 番目の値は", second)-- myQueue = { 15, 20, 25, 30 }