Struktury kontrolne są stwierdzeniami, które zarządzają przepływem wykonania kodu Luau. Istnieje cztery główne rodzaje struktur kontrolnych:
- Zgłoszenie jeśli inaczej z wykonaniem kodu wykonuje się tylko wtedy, jeśli spełniony zdefiniowany warunek jest true . Zgłoszenie kodu nie powtarza się.
- A podczas gdy pętla wykonuje kod tylko, jeśli określony warunek jest true , a powtarza wykonanie, gdy warunek pozostaje true .
- Powtarzający się loop wykonuje kod i powtarza wykonanie, jeśli warunek jest true .
- A do pętli wykonuje kod w określonej liczbie razy w zależności od podanych wejść.
Warunkiem dla if stwierdzeń, while pętli i repeat pętli może być dowolna wyrażenie Luau lub wartość. Jeśli wartość nie jest 2> false2> lub 5> nil
Jeśli oświadczenia
Podstawowe if oświadczenie testuje jego warunki. Jeśli warunek jest prawdziwy, to Luau wykonuje kod pomiędzy then i end.
Możesz użyć elseif stwierdzenie, aby testować na dodatkowe warunki, jeśli if warunki są fałszywe. Możesz użyć else stwierdzenie, aby wykonano kod, jeśli wsz
W if , elseif i else łańcuchu, Luau testuje warunki od góry do dołu, zatrzymuje się na pierwszej <a href="/reference/engine/databases">真实</a> warunku i wykonuje kod, który następnie jest wykonany.
if 2 + 2 == 5 thenprint("Two plus two is five") -- Nie drukuje się, 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 się, ponieważ poprzedni warunek jest prawdziwyend
Podczas gdy Loops
A while — do pętla ocenia, czy określona kondycja jest prawdziwa lub fałszywa. Jeśli kondycja jest false lub 1> nil1>, to pętla kończy się, a Luau omiina kod w pętli. Jeśli kondycja jest 4>
local timeRemaining = 10while timeRemaining > 0 doprint("Seconds remaining: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Timer reached zero!")--[[ Wyświetlany wynik: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ętli
Możesz użyć pętli while — do do nieskończoności, pisząc true jako warunek.
while true doprint("Looping...")task.wait(0.5)end--[[ Wyświetlany wynik:Looping...Looping...Looping...Looping......]]
Pętle powtarzające się
Pętla repeat — until powtarza się, aż kondycja będzie prawdziwa. Warunkowy test ocenia po zakończeniu bloku kodu, więc blok kodu zawsze będzie działać przynajmniej raz. W przeciwieństwie do innych języków, zakres 2>luau2> lokalnej zmiennej z
local currentGoblinCount = 18-- Wygeneruj gobliny do maksymalnie 25 w grarepeatspawnGoblin()currentGoblinCount += 1print("Current goblin count: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblins repopulated!")--[[ Wyświetlany wynik: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
A for loop wykonuje kod, zdefiniowany na liczbę razy, lub na liczbę pozycji w kolekcji.
Liczby dla pętli
Pętla for — do określa liczbę czasów wykonania pętli używając kontroferta. Pętla jest deklarowana z wartością początkową, wartością końcową i opcjonalnym zwiększeniem.
Luau ustawia licznik równy wartości początkowej, wykonuje blok kodu w pętli for i następnie dodaje increment do kontroferta. Jeśli increment jest pozytywny, to proces powtarza się, aż licznik będzie równy lub większy niż wartość końcowa. Jeśli increment jest ujemny, to 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łkowity liczba.
for counter = 1, 3 doprint(counter)end--[[ Wyświetlany wynik:123]]for counter = 1, 6, 2 doprint(counter)end--[[ Wyświetlany wynik:135]]for counter = 2, 0, -0.5 doprint(counter)end--[[ Wyświetlany wynik:21.510.50]]
Generyczne dla Loopów
Geniczny for pętli przechodzi nad pozycje w kolekcji, a nie po kolej z liczb. Z genycznymi for pętlami można wykonująć kod dla każdej pozycji w kolekcjai łatwo użyć każdej pozycji w kodzie.
Dla pętli wymaga funkcji lub inicjatora, aby przeprowadzać przez różne rodzaje zbiorów. Globalny ipairs() zwraca inicjator dla maszyny przeliczowej, a globalny pairs() zwraca inicjator dla słowników. Biblioteka string dostarcza 2>Library.ciąg.gmatch2> do przetwarz
Generyzowana Iteration
W Luau możesz przejść ponad tabelę używając bezpośrednio słowa kluczowego in na tabeli, zamiast używać funkcji przejścia takiej jak ipairs() :
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
Zaimplementowane powtórzenie umożliwia również użycie metody __iter dla powstawania funkcji implementora powtarzalnej. Ten skonfigurowany przykład powtarza się na maszynie w odwrotnym porządku, od jego 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
--[[ Wyświetlany wynik:
5 5
4 4
3 3
2 2
1 1
]]
Materiały
Funkcja ipairs() zwraca inkrementator, który przechodzi przez liczbowe wskaźniki w tabeli i zwraca index i value dla każdego elementu. To czyni go odpowiednim dla tabel, w których wszystkie wskaźniki są liczbowe.
local array = {"a", "b", "c", "d", "e"}for index, value in ipairs(array) doprint(index, value)end--[[ Wyświetlany wynik:1 a2 b3 c4 d5 e]]
Słowniki
Funkcja pairs() wwraca przejścia przez wszystkie indeksy (w tym liczbowe indeksy) w tabeli i zwraca key i value dla każdej pozycji w tabeli słów典. Rząd przejścia elementów w tabeli słów典 jest arbitralny. To sprawia, że jest odpowiednie do przejścia nad dyktionary, gdzie
local dictionary = {[1] = "a",["Hello"] = "b",[5] = "c",[true] = "d",["World"] = "f",[false] = "e"}for key, value in pairs(dictionary) doprint(key, value)end--[[ Wyświetlany wynik:Hello btrue dfalse eWorld f5 c1 a]]
Kontrolowanie słów kluczowych
Łączenie pętli
Aby zmusić pętel do kończyć, użyj słowa kluczowego break. Poniższy przykład kodu pokazuje, jak złamać nieskończoną pętelę 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!")--[[ Wyświetlany wynik:12345Five seconds elapsed. Time to move on!]]
Końcowe pętli
Aby zmusić pętelę do powtarzania się i ponownego uruchomienia, użyj słowa kluczowego continue. Pętla for będzie przejść przez kontroferta; while i 2>peat2> — 5> até5> sprawdzi stan
local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- Przeprowadza przez pętę
table.insert(children, child)
end
return children
end