Struktury kontrolne

*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 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 then
print("Dwa dodać dwa to pięć") -- Nie wypisuje, ponieważ warunek jest fałszywy
elseif 2 + 3 == 5 then
print("Dwa dodać trzy to pięć") -- Dwa dodać trzy to pięć
else
print("Wszystkie warunki zawiodły") -- Nie wypisuje, ponieważ poprzedni warunek jest prawdziwy
end

Pętle while

Pętla whiledo 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 = 10
while czasPozostały > 0 do
print("Pozostałe sekundy: " .. czasPozostały)
task.wait(1)
czasPozostały -= 1
end
print("Zegar osiągnął zero!")
--[[ Wynikowy wydruk:
Pozostałe sekundy: 10
Pozostałe sekundy: 9
Pozostałe sekundy: 8
Pozostałe sekundy: 7
Pozostałe sekundy: 6
Pozostałe sekundy: 5
Pozostałe sekundy: 4
Pozostałe sekundy: 3
Pozostałe sekundy: 2
Pozostałe sekundy: 1
Zegar osiągnął zero!
]]

Pętle nieskończone

Możesz użyć pętli whiledo, aby napisać nieskończone pętle gry, ustawiając true jako warunek.


while true do
print("Pętla...")
task.wait(0.5)
end
--[[ Wynikowy wydruk:
Pętla...
Pętla...
Pętla...
Pętla...
...
]]

Pętle repeat

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


local obecnaLiczbaGoblinów = 18
-- Spawny gobliny do maksymalnie 25 w grze
repeat
spawnGoblin()
obecnaLiczbaGoblinów += 1
print("Obecna liczba goblinów: " .. obecnaLiczbaGoblinów)
until obecnaLiczbaGoblinów == 25
print("Gobliny odrodzone!")
--[[ Wynikowy wydruk:
Obecna liczba goblinów: 19
Obecna liczba goblinów: 20
Obecna liczba goblinów: 21
Obecna liczba goblinów: 22
Obecna liczba goblinów: 23
Obecna liczba goblinów: 24
Obecna liczba goblinów: 25
Gobliny 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 fordo 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 do
print(licznik)
end
--[[ Wynikowy wydruk:
1
2
3
]]
for licznik = 1, 6, 2 do
print(licznik)
end
--[[ Wynikowy wydruk:
1
3
5
]]
for licznik = 2, 0, -0.5 do
print(licznik)
end
--[[ Wynikowy wydruk:
2
1.5
1
0.5
0
]]

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} do
print(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) do
print(index, value)
end
--[[ Wynikowy wydruk:
1 a
2 b
3 c
4 d
5 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) do
print(key, value)
end
--[[ Wynikowy wydruk:
Witaj b
true d
false e
Świat f
5 c
1 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ę whiledo.


local sekundyUpłynęły = 0
local limitCzasu = 5
while true do
task.wait(1)
sekundyUpłynęły += 1
print("Sekundy upłynęły:", sekundyUpłynęły)
if sekundyUpłynęły == limitCzasu then
break
end
end
print("Pięć sekund minęło. Czas ruszyć dalej!")
--[[ Wynikowy wydruk:
1
2
3
4
5
Pięć 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 repeatuntil 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
©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.