Estruturas de controle são declarações que gerenciam o fluxo da execução de código Luau. Existem quatro tipos principais de estruturas de controle:
- Uma declaração se então, se outra condição for especificada, o código será executado apenas se uma condição especificada for true. A execução de código não se repete.
- Um enquanto loop executa código apenas se uma condição especificada for true e repetir a execução enquanto a condição permanece true.
- Um Loop de Repetição executa código e repete a execução se a condição for true.
- Um para loop executa código um conjunto de vezes dependendo de entradas especificadas.
A condição para if declarações, while loops e repeat loops pode ser qualquer expressão Luau ou valor. Se um valor não for 2>false2> ou 5>nil5>, então o Luau o avalia como 8>true8> em declarações
Se Estados
A declaração básica if testa sua condição. Se a condição for verdadeira, então o Luau executa o código entre then e end.
Você pode usar uma declaração elseif para testar por condições adicionais se a condição if for falsa. Você pode usar uma declaração else para executar código se todas as condições 1>
Em uma cadeia de if, elseif e else condições, Luau testa condições de topo para baixo, parar na primeira condição 1>true1> e executar o código que segue.
if 2 + 2 == 5 thenprint("Two plus two is five") -- Não imprime porque a condição é falsaelseif 2 + 3 == 5 thenprint("Two plus three is five") -- Dois mais três é cincoelseprint("All conditions failed") -- Não imprime porque a condição anterior é verdadeiraend
Enquanto Loops
Um while — do loop avalia se uma condição especificada é verdadeira ou falsa. Se a condição for false ou 1> nil1>, então o loop termina e Luau pula o código no loop. Se a condição for 4> true4> , então Luau executa o código no loop e
local timeRemaining = 10while timeRemaining > 0 doprint("Seconds remaining: " .. timeRemaining)task.wait(1)timeRemaining -= 1endprint("Timer reached zero!")--[[ Resultado da saída:Seconds remaining: 10Seconds remaining: 9Seconds remaining: 8Seconds remaining: 7Seconds remaining: 6Seconds remaining: 5Seconds remaining: 4Seconds remaining: 3Seconds remaining: 2Seconds remaining: 1Timer reached zero!]]
Ciclos Infinitos
Você pode usar um while — do loop para escrever infinitas game loops definindo true como a condição.
while true doprint("Looping...")task.wait(0.5)end--[[ Resultado da saída:Looping...Looping...Looping...Looping......]]
Repetir Loops
O repeat — until o loop se repete até uma condição ser verdadeira. O teste condicional avalia depois que o bloco de código for executado, então o bloco de código sempre será executado pelo menos uma vez. Diferente dos outros idiomas, o escopo de uma variável local declarada dentro de um 2>peat2> — 5> até
local currentGoblinCount = 18-- Gerar goblins até um máximo de 25 no jogorepeatspawnGoblin()currentGoblinCount += 1print("Current goblin count: " .. currentGoblinCount)until currentGoblinCount == 25print("Goblins repopulated!")--[[ Resultado da saída:Current goblin count: 19Current goblin count: 20Current goblin count: 21Current goblin count: 22Current goblin count: 23Current goblin count: 24Current goblin count: 25Goblins repopulated!]]
Para Loops
A para loop executa código um conjunto de vezes, seja baseado em um contador numerico ou o número de itens em uma coleção.
Número para Loops
Um loop for — do — incrementa opcional determina o número de vezes que o loop será executado usando um contra-oferta. O loop é declarado com um valor de início, um valor de fim e um incremento opcional.
O Luau define o contador igual ao valor de início, executa o bloco de código na for loop, então adiciona o incremento ao contra-oferta. Se o incremento for positivo, então o processo se repete até que o contador seja igual ou maior que o valor de fim. Se o incremento for negativo, então o processo se repete até que o contador seja igual ou menor que o valor de fim.
O incremento opcional padrão é 1. Não é necessário que seja um número inteiro.
for counter = 1, 3 doprint(counter)end--[[ Resultado da saída:123]]for counter = 1, 6, 2 doprint(counter)end--[[ Resultado da saída:135]]for counter = 2, 0, -0.5 doprint(counter)end--[[ Resultado da saída:21.510.50]]
Gerico para Loops
O loop genérico for itera sobre os itens em uma coleção, em vez de uma sequência de números. Com o loop genérico for, você pode executar código para cada item na coleçõese pode facilmente usar cada item no código.
Para loops precisa de uma função, ou iterador, para iteração sobre diferentes tipos de coleções. O global ipairs() retorna um iterador para arrays, e o global pairs() retorna um iterador para dicionários. A string biblioteca fornece 1> Library.string / cadeia / texto.gmatch()1> para iteração sobre strings.
Iteração Geralizada
In Luau, você pode iteração sobre uma tabela usando a palavra-chave in diretamente na tabela, em vez de usar uma função de iteração, como ipairs() :
for i, v in {1, 2, 3, 4, 5} doprint(i, v)end
A geração genérica também permite usar o método __iter para criar uma função de iteração personalizada. Este exemplo contornado itera em um array em ordem inversa, a partir de seu último elemento para o primeiro:
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
--[[ Resultado da saída:
5 5
4 4
3 3
2 2
1 1
]]
Matrizes
A função ipairs() retorna um it器 que itera através de índices numéricos em uma tabela e retorna um index e value para cada elemento. Isso torna-se adequado para matrizes, onde todos os índices são numéricos.
local array = {"a", "b", "c", "d", "e"}for index, value in ipairs(array) doprint(index, value)end--[[ Resultado da saída:1 a2 b3 c4 d5 e]]
Dicionários
A função pairs() retorna um itérator que itera através de todos os índices (incluindo índices numéricos) em uma tabela e retorna um key e value para cada entrada na tabela de dicionário. A ordem de traversar elementos em uma tabela de dicionário é arbitrária. Isso torna-se apropriado para iteração sobre dicionários, onde os itens são
local dictionary = {[1] = "a",["Hello"] = "b",[5] = "c",[true] = "d",["World"] = "f",[false] = "e"}for key, value in pairs(dictionary) doprint(key, value)end--[[ Resultado da saída:Hello btrue dfalse eWorld f5 c1 a]]
Controlar Palavras-Chave
Quebrando Loops
Para forçar um loop para terminar/parar/sair, use a palavra-chave break. O exemplo de código a seguir mostra como quebrar um loop infinito while — doLoop.
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!")--[[ Resultado da saída:12345Five seconds elapsed. Time to move on!]]
Loopings Contínuos
Para forçar um loop para iteração e novamente, use a palavra-chave continue. Um loop for será iteração de contra-oferta; while e 1> peat1> — 4> até 4> verificará a condição de loop antes de continuar
local function GetChildrenOfClass(parent: Instance, className: string): {Instance}
local children = {}
for _, child in parent:GetChildren() do
if child.ClassName ~= className then continue end -- Itera o loop
table.insert(children, child)
end
return children
end