排隊是一個線性資料結構,包含一個集合的項目。 在 Roblox 上有兩種類型的排隊:正常排隊,按照第一入第一出 (FIFO) 原則,和優先排隊,按照資料存取順序優先擁有項目。 在兩種類型的排隊中,都可以有任何 Luau 的資料類型。
排隊是 非持久資存服務 的內置資料結構,為其你可以直接呼叫內置函數來取得排隊並從排隊中添新增 加至、閱已讀或移除資料。對於任何其他用途,例如在您的體驗中排程任務並處理請求,你可以使用表來實現排隊。
正常排隊
規則排隊是以 FIFO 順序進行維護,在此順序中,所有物品都會先添加到排隊的後方,然後按照相同的順序在前方移除或添加。
優先權排隊
優先排隊不遵循 FIFO 規則,在此中每個項目可以添加一個優先數字,表示其順序是閱取或移除。順序階層的項目背後有預設優先權 0,前方的項目則有最高優先權 5。以下是順序階層的項目示例:
為此示例,3 個優先權的物品正在添加到佇列。佇列會將新物品放在現有物品的優先權 3 或更高的後面。要將一個物品放在佇列的前面,您需要將優先權設置為 6 或更高。在此示例中,您需要將優先權設置為 6 或更高。
優先權佇列有助於您想要閱取或存取資料的順序而不是順序被添加的情況。 您可以在添加道具目時設置優先權作為整數,並且在項目與更低優先級之前處理項目。 例如,您可以使用優先權佇列來進行匹配,並且在等待很長時間的用戶分配更低優先權。
實現排隊
您可以使用 MemoryStoreService 的內置排隊列表,或使用 Class.Tables 來實現所有其他使用。下列代碼示例顯示了實現 Class.MemoryStoreService 的排隊列表。為您的體驗存取此實現,您應該將其儲存為 2>Class
使用表實現規則排隊
--!嚴格
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 的使用例。您可以修改代碼、類輸入和存儲位置,以適合您自己的使用,只要您有正確儲存 Class.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)-- 我的排隊列 = { 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 }