Eine Warteschlange ist eine lineare Datenstruktur mit einer Sammlung von Elementen. Es gibt zwei Arten von Warteschlangen auf Roblox: reguläre Warteschlangen, die dem First-In-First-Out (FIFO) Prinzip folgen, und Prioritätswarteschlangen, die Prioritäten für Elemente in der Warteschlange haben, die die Reihenfolge des Datenzugriffs bestimmen. Elemente in beiden Arten von Warteschlangen können jeden Luau Datentyp haben.
Warteschlange ist eine eingebaute Datenstruktur des nicht persistente Datenspeichers Dienstes namens MemoryStoreService, für den Sie die eingebauten Funktionen direkt aufrufen können, um eine Warteschlange zu erhalten und Daten hinzuzufügen, zu lesen oder aus der Warteschlange zu entfernen. Für jede andere Verwendung, wie das Planen von Aufgaben und das Bearbeiten von Anfragen in Ihrem Spiel, können Sie Tabellen verwenden, um Warteschlangen selbst zu implementieren.
Reguläre Warteschlangen
Reguläre Warteschlangen werden in der FIFO-Reihenfolge verwaltet, in der alle Elemente hinten in die Warteschlange eingefügt und in derselben Reihenfolge gelesen oder entfernt werden, in der sie hinzugefügt wurden, von vorne nach hinten.

Prioritätswarteschlangen
Prioritätswarteschlangen folgen nicht der FIFO-Regel, in der jedes Element mit einer Prioritätsnummer hinzugefügt werden kann, die seine Reihenfolge beim Lesen oder Entfernen angibt. Das Element am Ende einer Prioritätswarteschlange hat die Standardpriorität von 0, und das Element am Anfang der Warteschlange hat die höchste eingestellte Priorität, die im folgenden Beispiel 5 beträgt.

Für dieses Beispiel wird ein Element mit einer eingestellten Priorität von 3 zu einer Warteschlange hinzugefügt. Die Warteschlange platziert das neue Element hinter allen vorhandenen Elementen mit der eingestellten Priorität von 3 oder mehr. Um ein Element an den Anfang der Warteschlange zu setzen, müssen Sie die Priorität höher als die derzeit höchste eingestellte Priorität festlegen. In diesem Beispiel müssen Sie die Priorität auf 6 oder höher festlegen.
Prioritätswarteschlangen sind nützlich in Situationen, in denen Sie Daten basierend auf der Wichtigkeit anstelle der Reihenfolge, in der sie hinzugefügt werden, lesen oder zugreifen möchten. Sie können eine Priorität als Ganzzahl festlegen, wenn Sie ein Element hinzufügen, und die Warteschlange verarbeitet Elemente mit höherer Priorität vor solchen mit niedrigerer Priorität. Zum Beispiel können Sie Prioritätswarteschlangen für das Matchmaking verwenden, indem Sie Benutzern, die lange gewartet haben, höhere Prioritäten zuweisen.
Warteschlangen implementieren
Sie können die eingebauten Warteschlangen von MemoryStoreService verwenden oder Tabellen verwenden, um Warteschlangen für alle anderen Verwendungen zu implementieren. Das folgende Codebeispiel zeigt die Implementierung einer regulären Warteschlange. Um diese Implementierung für Ihr Spiel zu verwenden, sollten Sie sie als ModuleScript speichern und in ReplicatedStorage ablegen, damit Ihre Warteschlange sowohl für den Client als auch für den Server zugänglich ist.
Implementierung einer regulären Warteschlange mit Tabelle
--!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
-- Überprüfen, ob die Warteschlange leer ist
function Queue.isEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- Einen Wert zur Warteschlange hinzufügen
function Queue.enqueue<T>(self: Queue<T>, value: T)
local last = self._last + 1
self._last = last
self._queue[last] = value
end
-- Einen Wert aus der Warteschlange entfernen
function Queue.dequeue<T>(self: Queue<T>): T
if self:isEmpty() then
error("Kann nicht aus leerer Warteschlange dequeuen")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue
Das folgende Codebeispiel ist ein Anwendungsbeispiel als Script unter Workspace. Sie können den Code, den Typ und den Speicherort an Ihre eigenen Anforderungen anpassen, solange Sie das vorherige Implementierungscodebeispiel korrekt gespeichert haben.
Beispiel zur Verwendung einer regulären Warteschlangelocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Queue = require(ReplicatedStorage:WaitForChild("Queue"))local myQueue = Queue.new()-- Fügen Sie einige Werte zur Warteschlange hinzumyQueue:enqueue(5)myQueue:enqueue(10)myQueue:enqueue(15)-- myQueue = { 5, 10, 15 }-- Entfernen Sie einen Wert aus der Warteschlangelocal first = myQueue:dequeue()print("Der erste hinzugefügte Wert in die Warteschlange war", first)-- myQueue = { 10, 15 }-- Fügen Sie weitere Werte zur Warteschlange hinzumyQueue:enqueue(20)myQueue:enqueue(25)myQueue:enqueue(30)-- myQueue = { 10, 15, 20, 25, 30 }-- Entfernen Sie einen weiteren Wert aus der Warteschlangelocal second = myQueue:dequeue()print("Der zweite hinzugefügte Wert in die Warteschlange war", second)-- myQueue = { 15, 20, 25, 30 }