Kolejka to liniowa struktura danych z kolekcją elementów. Na Robloxie istnieją dwa typy kolejek: zwykłe kolejki, które przestrzegają zasady FIFO (First In First Out), oraz kolejki priorytetowe, które mają priorytety dla elementów w kolejce, które określają kolejność dostępu do danych. Elementy w obu typach kolejek mogą być dowolnym typem danych Luau.
Kolejka jest wbudowaną strukturą danych usługi nieprzechowywanego magazynu danych o nazwie MemoryStoreService, dla której możesz bezpośrednio wywołać wbudowane funkcje, aby uzyskać kolejkę oraz dodać, odczytać lub usunąć dane z kolejki. Do wszelkich innych zastosowań, takich jak planowanie zadań i obsługa żądań w twojej grze, możesz użyć tabel do samodzielnej implementacji kolejek.
Zwykłe kolejki
Zwykłe kolejki są utrzymywane w kolejności FIFO, w której wszystkie elementy są dodawane na koniec kolejki i odczytywane lub usuwane w tej samej kolejności, w jakiej zostały dodane, od przodu do końca.

Kolejki priorytetowe
Kolejki priorytetowe nie przestrzegają zasady FIFO, w której każdy element może być dodany z numerem priorytetu, który wskazuje jego kolejność odczytu lub usunięcia. Element na końcu kolejki priorytetowej ma domyślny priorytet 0, a element na początku kolejki ma najwyższy ustalony priorytet, który w poniższym przykładzie wynosi 5.

W tym przykładzie element z ustalonym priorytetem 3 jest dodawany do kolejki. Kolejka umieszcza nowy element za wszystkimi istniejącymi elementami o ustalonym priorytecie 3 lub wyższym. Aby umieścić element na początku kolejki, musisz ustawić priorytet wyżej niż aktualny najwyższy ustalony priorytet. W tym przykładzie musisz ustawić priorytet na 6 lub wyższy.
Kolejki priorytetowe są przydatne w sytuacjach, gdy chcesz odczytywać lub uzyskiwać dostęp do danych na podstawie kolejności ważności zamiast kolejności dodawania. Możesz ustawić priorytet jako całkowitą liczbę podczas dodawania elementu, a kolejka przetwarza elementy z wyższym priorytetem przed elementami z niższymi priorytetami. Na przykład możesz używać kolejek priorytetowych do matchmakingu, przypisując wyższe priorytety użytkownikom, którzy czekają najdłużej.
Implementacja kolejek
Możesz używać wbudowanych kolejek MemoryStoreService lub używać tabel do implementacji kolejek do innych zastosowań. Poniższy przykład kodu pokazuje implementację zwykłej kolejki. Aby użyć tej implementacji w swojej grze, powinieneś zapisać ją jako ModuleScript i umieścić w ReplicatedStorage, aby twoja kolejka była dostępna zarówno dla klienta, jak i serwera.
Implementacja Zwykłej Kolejki Przy Użyciu Tabeli
--!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
-- Sprawdź, czy kolejka jest pusta
function Queue.isEmpty<T>(self: Queue<T>)
return self._first > self._last
end
-- Dodaj wartość do kolejki
function Queue.enqueue<T>(self: Queue<T>, value: T)
local last = self._last + 1
self._last = last
self._queue[last] = value
end
-- Usuń wartość z kolejki
function Queue.dequeue<T>(self: Queue<T>): T
if self:isEmpty() then
error("Nie można usunąć z pustej kolejki")
end
local first = self._first
local value = self._queue[first]
self._queue[first] = nil
self._first = first + 1
return value
end
return Queue
Poniższy przykład kodu jest przykładem użycia jako Script w Workspace. Możesz zmodyfikować kod, typ i lokalizację przechowywania, aby dostosować je do własnych potrzeb, pod warunkiem, że masz wcześniej poprawnie zapisany kod implementacji.
Przykład Użycia Zwykłej Kolejkilocal ReplicatedStorage = game:GetService("ReplicatedStorage")local Queue = require(ReplicatedStorage:WaitForChild("Queue"))local myQueue = Queue.new()-- Dodaj kilka wartości do kolejkimyQueue:enqueue(5)myQueue:enqueue(10)myQueue:enqueue(15)-- myQueue = { 5, 10, 15 }-- Usuń jedną wartość z kolejkilocal first = myQueue:dequeue()print("Pierwsza wartość dodana do kolejki to", first)-- myQueue = { 10, 15 }-- Dodaj więcej wartości do kolejkimyQueue:enqueue(20)myQueue:enqueue(25)myQueue:enqueue(30)-- myQueue = { 10, 15, 20, 25, 30 }-- Usuń kolejną wartość z kolejkilocal second = myQueue:dequeue()print("Druga wartość dodana do kolejki to", second)-- myQueue = { 15, 20, 25, 30 }