隊列是一個線性數據結構,包含一個集合的項目。在 Roblox 上有兩種類型的隊列:普通隊列,遵循第一入最先出(FIFO)原則,和優先級隊列,其中隊列中的項目有優先級,決定數據存取順序。兩種類型的隊列中的項目可以是任何 Luau 資料類型。
隊列是 非永久數據存儲 服務名為 MemoryStoreService 的內置數據結構,您可以直接呼叫內置函數來獲得隊列並從隊列中新增 加至、已讀或移除數據。對於任何其他用途,例如在體驗中安排任務和處理請求,您可以使用表來自擁有實現隊列。
普通隊列
普通隊列會被保留在 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
以下代碼示例是作為 Script 在 Workspace 下的使用示例。您可以修改代碼、輸入和儲存位置,以符合自己的使用需求,只要您有以前的實裝代碼樣本正確存儲即可。
常見的隊列使用例子
local ReplicatedStorage = game:GetService("ReplicatedStorage")local Queue = require(ReplicatedStorage:WaitForChild("Queue"))local myQueue = Queue.new()-- 添加一些值到隊列myQueue:enqueue(5)myQueue:enqueue(10)myQueue:enqueue(15)-- 我的隊列 = { 5、10、15}-- 從隊列中移除一個值local first = myQueue:dequeue()print("The first value added to the queue was", first)-- 我的隊列 = {10、15}-- 添加更多值到隊列myQueue:enqueue(20)myQueue:enqueue(25)myQueue:enqueue(30)-- 我的隊列 = {10、15、20、25、30}-- 從隊列中移除另一個值local second = myQueue:dequeue()print("The second value added to the queue was", second)-- myQueue = { 15, 20, 25, 30 }