Struktury kontroli to oświadczenia, które zarządzają przepływem wykonywania kodu Luau. Istnieją cztery główne rodzaje struktur kontroli:
- Oświadczenie jeśli inne wykonuje kod tylko wtedy, gdy określone warunki są true . Wykonanie kodu nie powtarza się.
- Pętla while wykonuje kod tylko wtedy, gdy określone warunek jest , i powtarza wykonanie, gdy warunek pozostaje .
- Pętla powtórzenia powtarza kod i powtarza wykonanie, jeśli warunek jest true.
- A dla pętla wykonuje kod określoną liczbę razy w zależności od określonych wejść.
Warunek dla if oświadczeń, while pętli i repeat pętli może być dowolną wyrażeniem lub wartością Luau.Jeśli wartość nie jest false lub nil, Luau ocenia ją jako true w warunkach warunkowych.W przeciwieństwie do innych języków programowania Luau rozważa zarówno zero, jak i pustą strunę jako true.
Jeśli oświadczenia
Podstawowe oświadczenie if testuje jego warunek. Jeśli warunek jest prawdziwy, to Luau wykonuje kod między then a end.
Możesz użyć oświadczenia elseif, aby przetestować dodatkowe warunki, jeśli warunek if jest fałszywy.Możesz użyć oświadczenia else, aby wykonać kod, jeśli wszystkie warunki if i elseif zawiodą.Części elseif i else są obowiązkowe, ale nie możesz ich używać bez początkowego oświadczenia if.
W łańcuchu if, elseif i else warunków Luau testuje warunki od góry do dołu, zatrzymuje się przy pierwszym true warunku i wykonuje kod, który go następuje.
if 2 + 2 == 5 thenprint("Two plus two is five") -- Nie drukuje, ponieważ warunek jest fałszywyelseif 2 + 3 == 5 thenprint("Two plus three is five") -- Dwa plus trzy to pięćelseprint("All conditions failed") -- Nie drukuje, ponieważ poprzednia warunek jest prawdaend
Podczas pętli
Pętla while — do ocenia, czy określone warunki są prawdziwe lub fałszywe.Jeśli warunek jest false lub nil, to pętla się kończy, a Luau pomija kod w pętli.Jeśli warunek jest true, Luau wykonuje kod w pętli i powtarza proces.
local timeRemaining = 10while timeRemaining > 0 doprint("Seconds remaining: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Timer reached zero!")--[[ Wynikowe wyjście:Seconds remaining: 10Seconds remaining: 9Seconds remaining: 8Seconds remaining: 7Seconds remaining: 6Seconds remaining: 5Seconds remaining: 4Seconds remaining: 3Seconds remaining: 2Seconds remaining: 1Timer reached zero!]]
Nieskończone pętle
Możesz użyć pętli while — do do pisania nieskończonych pętli gry, ustawiając true jako warunek.
while true doprint("Looping...")task.wait(0.5)end--[[ Wynikowe wyjście:Looping...Looping...Looping...Looping......]]
Powtarzaj pętle
Pętla repeat — until powtarza się do czasu, aż warunek będzie prawdziwy.Test warunkowy ocenia po wykonaniu bloku kodu, więc blok kodu zawsze uruchamiany jest co najmniej raz.W przeciwieństwie do innych języków zakres Luau lokalnej zmiennej deklarowanej w pętlu repeat — until obejmuje warunk.
local currentGoblinCount = 18-- Wygeneruj gobliny do maksymalnie 25 w grarepeatspawnGoblin()currentGoblinCount += 1print("Current goblin count: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblins repopulated!")--[[ Wynikowe wyjście:Current goblin count: 19Current goblin count: 20Current goblin count: 21Current goblin count: 22Current goblin count: 23Current goblin count: 24Current goblin count: 25Goblins repopulated!]]
Dla pętli
Pętla A wykonuje kod określoną liczbę razy, na podstawie licznika liczbowego lub liczby przedmiotów w kolekcji.
Liczbowy dla pętli
Pętla for — do określa liczbę razy, w których należy wykonać pętlę za pomocą kontroferta.Pętla jest deklarowana z wartością początkową, wartością końcową i opcjonalnym wzrostem.
Luau ustawia licznik równy wartości początkowej, wykonuje blok kodu w pętlu for, a następnie dodaje zwiększenie do kontroferta.Jeśli wzrost jest pozytywny, proces powtarza się do czasu, aż licznik będzie równy lub większy od wartości końcowej.Jeśli wzrost jest ujemny, proces powtarza się aż licznik będzie równy lub mniejszy niż wartość końcowa.
Opcjonalny wzrost domyślnie wynosi 1. Nie musi to być całkowita liczba.
for counter = 1, 3 doprint(counter)end--[[ Wynikowe wyjście:123]]for counter = 1, 6, 2 doprint(counter)end--[[ Wynikowe wyjście:135]]for counter = 2, 0, -0.5 doprint(counter)end--[[ Wynikowe wyjście:21.510.50]]
Generyczny dla pętli
Ogólna pętla for powtarza się nad przedmiotami w kolekcji, a nie nad sekwencją liczb.Dzięki ogólnym pędom for możesz wykonać kod dla każdego elementu w kolekcjai możesz łatwo używać każdego elementu w kodzie.
Pętle potrzebują funkcji lub iteratora, aby przeszukiwać różne rodzaje kolekcji.Globalny ipairs() zwraca iterator dla tablic, a globalny pairs() zwraca iterator dla słowników.Biblioteka string zapewnia string.gmatch() powtarzanie się nad ciągami.
Generalizowana iteracja
W Luau możesz powtarzać nad tabelą za pomocą klucza in bezpośrednio na tabeli, zamiast używać funkcji iteratora, takiej jak ipairs() :
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
Generalizowana iteracja pozwala również używać metametody __iter do tworzenia niestandardowej funkcji iteratora.Ten udoskonalony przykład powtarza się nad matrycą w odwrotnej kolejności, od jej ostatniego elementu do pierwszego:
local myTable = {1, 2, 3, 4, 5}
myMetatable = {
__iter = function(t)
local i = #t + 1
return function()
i -= 1
if i > 0 then
return i, t[i]
end
end
end,
}
setmetatable(myTable, myMetatable)
for i, v in myTable do
print(i, v)
end
--[[ Wynikowe wyjście:
5 5
4 4
3 3
2 2
1 1
]]
Matryce
Funkcja ipairs() zwraca iterator, który iteruje przez indeksy liczbowe w tabeli i zwraca index i value dla każdego elementu.To sprawia, że jest odpowiednie dla tablic, w których wszystkie indeksy są liczbowe.
local array = {"a", "b", "c", "d", "e"}for index, value in ipairs(array) doprint(index, value)end--[[ Wynikowe wyjście:1 a2 b3 c4 d5 e]]
Słowniki
Funkcja pairs() zwraca iterator, który iteruje przez wszystkie indeksy (w tym indeksy liczbowe) w tabeli i zwraca key i value dla każdej pozycji w słowniku. kolejność przemierzania elementów w tabeli słownika jest arbitralna.To czyni odpowiednim iterowanie nad słownikami, gdzie elementy są przechowywane w nieładzie z niecyfrowymi indeksami.
local dictionary = {[1] = "a",["Hello"] = "b",[5] = "c",[true] = "d",["World"] = "f",[false] = "e"}for key, value in pairs(dictionary) doprint(key, value)end--[[ Wynikowe wyjście:Hello btrue dfalse eWorld f5 c1 a]]
Złamuj pętle
Aby zmusić pętelę do kończyć, użyj klucz break. Poniższy przykład kodu pokazuje, jak przerwać nieskończoną pętlę while — do.
local secondsElapsed = 0local timeout = 5while true dotask.wait(1)secondsElapsed += 1print("Seconds elapsed:", secondsElapsed)if secondsElapsed == timeout thenbreakendendprint("Five seconds elapsed. Time to move on!")--[[ Wynikowe wyjście:12345Five seconds elapsed. Time to move on!]]
Kontynuuj pętle
Aby zmusić pętel do powtórzenia i ponownego rozpoczęcia, użyj kluczowa continue >.Pętla for będzie powtarzać kontroferta; while i repeat — until sprawdzi warunek pętli przed kontynuacją.Poniższy przykład kodu otrzymuje wszystkie dzieci z Instance określonego ClassName .
local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- Powtarza pętla
table.insert(children, child)
end
return children
end