Struktury kontroli

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

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 then
print("Two plus two is five") -- Nie drukuje, ponieważ warunek jest fałszywy
elseif 2 + 3 == 5 then
print("Two plus three is five") -- Dwa plus trzy to pięć
else
print("All conditions failed") -- Nie drukuje, ponieważ poprzednia warunek jest prawda
end

Podczas pętli

Pętla whiledo 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 = 10
while timeRemaining > 0 do
print("Seconds remaining: " .. timeRemaining)
task.wait(1)
timeRemaining -= 1
end
print("Timer reached zero!")
--[[ Wynikowe wyjście:
Seconds remaining: 10
Seconds remaining: 9
Seconds remaining: 8
Seconds remaining: 7
Seconds remaining: 6
Seconds remaining: 5
Seconds remaining: 4
Seconds remaining: 3
Seconds remaining: 2
Seconds remaining: 1
Timer reached zero!
]]

Nieskończone pętle

Możesz użyć pętli whiledo do pisania nieskończonych pętli gry, ustawiając true jako warunek.


while true do
print("Looping...")
task.wait(0.5)
end
--[[ Wynikowe wyjście:
Looping...
Looping...
Looping...
Looping...
...
]]

Powtarzaj pętle

Pętla repeatuntil 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 repeatuntil obejmuje warunk.


local currentGoblinCount = 18
-- Wygeneruj gobliny do maksymalnie 25 w gra
repeat
spawnGoblin()
currentGoblinCount += 1
print("Current goblin count: " .. currentGoblinCount)
until currentGoblinCount == 25
print("Goblins repopulated!")
--[[ Wynikowe wyjście:
Current goblin count: 19
Current goblin count: 20
Current goblin count: 21
Current goblin count: 22
Current goblin count: 23
Current goblin count: 24
Current goblin count: 25
Goblins 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 fordo 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 do
print(counter)
end
--[[ Wynikowe wyjście:
1
2
3
]]
for counter = 1, 6, 2 do
print(counter)
end
--[[ Wynikowe wyjście:
1
3
5
]]
for counter = 2, 0, -0.5 do
print(counter)
end
--[[ Wynikowe wyjście:
2
1.5
1
0.5
0
]]

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} do
print(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) do
print(index, value)
end
--[[ Wynikowe wyjście:
1 a
2 b
3 c
4 d
5 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) do
print(key, value)
end
--[[ Wynikowe wyjście:
Hello b
true d
false e
World f
5 c
1 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ę whiledo.


local secondsElapsed = 0
local timeout = 5
while true do
task.wait(1)
secondsElapsed += 1
print("Seconds elapsed:", secondsElapsed)
if secondsElapsed == timeout then
break
end
end
print("Five seconds elapsed. Time to move on!")
--[[ Wynikowe wyjście:
1
2
3
4
5
Five 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 repeatuntil 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