Struktury kontrolne to instrukcje, które zarządzają przebiegiem wykonywania kodu Luau. Istnieją cztery główne typy struktur kontrolnych:
- Instrukcja if then else wykonuje kod tylko wtedy, gdy określony warunek jest true. Wykonywanie kodu nie powtarza się.
- Pętla while wykonuje kod tylko wtedy, gdy określony warunek jest true, i powtarza wykonywanie, gdy warunek pozostaje true.
- Pętla repeat wykonuje kod i powtarza wykonanie, jeśli warunek jest true.
- Pętla for wykonuje kod ustaloną liczbę razy w zależności od określonych danych wejściowych.
Warunek dla instrukcji if, pętli while i pętli repeat może być dowolnym wyrażeniem lub wartością Luau. Jeśli wartość nie jest false lub nil, Luau ocenia ją jako true w instrukcjach warunkowych. W przeciwieństwie do innych języków skryptowych, Luau uznaje zarówno zero, jak i pusty ciąg za true.
Instrukcje if
Podstawowa instrukcja if testuje swój warunek. Jeśli warunek jest prawdziwy, Luau wykonuje kod między then a end.
Możesz użyć instrukcji elseif, aby sprawdzić dodatkowe warunki, jeśli warunek if jest fałszywy. Możesz użyć instrukcji else, aby wykonać kod, jeśli wszystkie warunki if i elseif zawiodły. Części elseif i else są opcjonalne, ale nie możesz użyć żadnej z nich bez początkowej instrukcji if.
W łańcuchu warunków if, elseif i else, Luau testuje warunki od góry do dołu, zatrzymuje się na pierwszym warunku true i wykonuje kod, który następuje po nim.
if 2 + 2 == 5 thenprint("Dwa dodać dwa to pięć") -- Nie wypisuje, ponieważ warunek jest fałszywyelseif 2 + 3 == 5 thenprint("Dwa dodać trzy to pięć") -- Dwa dodać trzy to pięćelseprint("Wszystkie warunki zawiodły") -- Nie wypisuje, ponieważ poprzedni warunek jest prawdziwyend
Pętle while
Pętla while—do ocenia, czy określony warunek jest prawdziwy czy fałszywy. Jeśli warunek jest false lub nil, pętla kończy się, a Luau pomija kod w pętli. Jeśli warunek jest true, Luau wykonuje kod w pętli i powtarza ten proces.
local czasPozostały = 10while czasPozostały > 0 doprint("Pozostałe sekundy: " .. czasPozostały)task.wait(1)czasPozostały -= 1endprint("Zegar osiągnął zero!")--[[ Wynikowy wydruk:Pozostałe sekundy: 10Pozostałe sekundy: 9Pozostałe sekundy: 8Pozostałe sekundy: 7Pozostałe sekundy: 6Pozostałe sekundy: 5Pozostałe sekundy: 4Pozostałe sekundy: 3Pozostałe sekundy: 2Pozostałe sekundy: 1Zegar osiągnął zero!]]
Pętle nieskończone
Możesz użyć pętli while—do, aby napisać nieskończone pętle gry, ustawiając true jako warunek.
while true doprint("Pętla...")task.wait(0.5)end--[[ Wynikowy wydruk:Pętla...Pętla...Pętla...Pętla......]]
Pętle repeat
Pętla repeat—until powtarza się, aż warunek będzie prawdziwy. Test warunkowy ocenia się po wykonaniu bloku kodu, więc blok kodu zawsze wykonuje się przynajmniej raz. W przeciwieństwie do innych języków, zakres Luau lokalnej zmiennej zadeklarowanej wewnątrz pętli repeat—until obejmuje warunek.
local obecnaLiczbaGoblinów = 18-- Spawny gobliny do maksymalnie 25 w grzerepeatspawnGoblin()obecnaLiczbaGoblinów += 1print("Obecna liczba goblinów: " .. obecnaLiczbaGoblinów)until obecnaLiczbaGoblinów == 25print("Gobliny odrodzone!")--[[ Wynikowy wydruk:Obecna liczba goblinów: 19Obecna liczba goblinów: 20Obecna liczba goblinów: 21Obecna liczba goblinów: 22Obecna liczba goblinów: 23Obecna liczba goblinów: 24Obecna liczba goblinów: 25Gobliny odrodzone!]]
Pętle for
Pętla for wykonuje kod ustaloną liczbę razy, w zależności od licznika numerycznego lub liczby elementów w kolekcji.
Numeryczne pętle for
Pętla for—do określa liczbę razy, które mają być wykonane w pętli, używając licznika. Pętla jest zadeklarowana z wartością początkową, końcową i opcjonalnym przyrostem.
Luau ustawia licznik równy wartości początkowej, wykonuje blok kodu w pętli for, a następnie dodaje przyrost do licznika. Jeśli przyrost jest dodatni, proces powtarza się, aż licznik jest równy lub większy od wartości końcowej. Jeśli przyrost jest ujemny, proces powtarza się, aż licznik jest równy lub mniejszy od wartości końcowej.
Opcjonalny przyrost domyślnie wynosi 1. Nie musi być liczbą całkowitą.
for licznik = 1, 3 doprint(licznik)end--[[ Wynikowy wydruk:123]]for licznik = 1, 6, 2 doprint(licznik)end--[[ Wynikowy wydruk:135]]for licznik = 2, 0, -0.5 doprint(licznik)end--[[ Wynikowy wydruk:21.510.50]]
Ogólne pętle for
Ogólna pętla for iteruje po elementach w kolekcji, a nie po sekwencji liczb. Dzięki ogólnym pętlom for możesz wykonać kod dla każdego elementu w kolekcji i łatwo użyć każdego elementu w kodzie.
Pętle for potrzebują funkcji lub iteratora, aby iterować po różnych typach kolekcji. Globalna funkcja ipairs() zwraca iterator dla tablic, a globalna funkcja pairs() zwraca iterator dla słowników. Biblioteka string udostępnia string.gmatch(), aby iterować po ciągach.
Uogólniona iteracja
W Luau możesz iterować po tabeli, używając słowa kluczowego in bezpośrednio w tabeli, zamiast używać funkcji iteratora, takiej jak ipairs():
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
Uogólniona iteracja pozwala również na użycie metody metatabeli __iter, aby utworzyć niestandardową funkcję iteratora. Ten przemyślany przykład iteruje po tablicy w odwrotnej kolejności, od jej ostatniego elementu do pierwszego:
local mojaTabela = {1, 2, 3, 4, 5}
mojaMetatabela = {
__iter = function(t)
local i = #t + 1
return function()
i -= 1
if i > 0 then
return i, t[i]
end
end
end,
}
setmetatable(mojaTabela, mojaMetatabela)
for i, v in mojaTabela do
print(i, v)
end
--[[ Wynikowy wydruk:
5 5
4 4
3 3
2 2
1 1
]]
Tablice
Funkcja ipairs() zwraca iterator, który iteruje przez numeryczne indeksy w tabeli i zwraca index oraz value dla każdego elementu. Czyni to odpowiednim dla tablic, gdzie wszystkie indeksy są numeryczne.
local tablica = {"a", "b", "c", "d", "e"}for index, value in ipairs(tablica) doprint(index, value)end--[[ Wynikowy wydruk:1 a2 b3 c4 d5 e]]
Słowniki
Funkcja pairs() zwraca iterator, który iteruje przez wszystkie indeksy (w tym numeryczne indeksy) w tabeli i zwraca key oraz value dla każdego wpisu w słowniku. Kolejność traversingu elementów w tabeli słownika jest arbitralna. Czyni to odpowiednim do iteracji po słownikach, gdzie elementy są przechowywane w sposób nieuporządkowany z indeksami nienumerycznymi.
local słownik = {[1] = "a",["Witaj"] = "b",[5] = "c",[true] = "d",["Świat"] = "f",[false] = "e"}for key, value in pairs(słownik) doprint(key, value)end--[[ Wynikowy wydruk:Witaj btrue dfalse eŚwiat f5 c1 a]]
Przerwanie pętli
Aby wymusić zakończenie pętli, użyj słowa kluczowego break. Poniższy przykład kodu pokazuje, jak przerwać nieskończoną pętlę while—do.
local sekundyUpłynęły = 0local limitCzasu = 5while true dotask.wait(1)sekundyUpłynęły += 1print("Sekundy upłynęły:", sekundyUpłynęły)if sekundyUpłynęły == limitCzasu thenbreakendendprint("Pięć sekund minęło. Czas ruszyć dalej!")--[[ Wynikowy wydruk:12345Pięć sekund minęło. Czas ruszyć dalej!]]
Kontynuowanie pętli
Aby wymusić, by pętla iterowała i zaczynała się od nowa, użyj słowa kluczowego continue. Pętla for zaktualizuje licznik; while i repeat—until sprawdzą warunek pętli przed kontynuowaniem. Poniższy przykład pobiera wszystkie dzieci instancji Instance określonego ClassName.
local function PobierzDzieciKlas(parent: Instance, className: string): {Instance}
local dzieci = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- Iteruje pętlę
table.insert(dzieci, child)
end
return dzieci
end