For-Schleife
Es gibt zwei Formen der for-Schleife, genau wie in Lua: eine numerische und eine generische.
for i = 10, 20 print i
for k = 1, 15, 2 -- ein optionaler Schritt print k
for key, value in pairs object print key, valuefor i = 10, 20 print i
for k = 1, 15, 2 -- ein optionaler Schritt print k
for key, value in pairs object print key, valueDie Slicing- und *-Operatoren können verwendet werden, genau wie bei Comprehensions:
for item in *items[2, 4] print itemfor item in *items[2, 4] print itemEine kürzere Syntax ist für alle Varianten verfügbar, wenn der Rumpf nur eine Zeile hat:
for item in *items do print item
for j = 1, 10, 3 do print jfor item in *items do print item
for j = 1, 10, 3 do print jEine for-Schleife kann auch als Ausdruck verwendet werden. Die letzte Anweisung im Schleifenrumpf wird in einen Ausdruck umgewandelt und an eine wachsende Array-Tabelle angehängt.
Alle geraden Zahlen verdoppeln:
doubled_evens = for i = 1, 20 if i % 2 == 0 i * 2 else idoubled_evens = for i = 1, 20 if i % 2 == 0 i * 2 else iZusätzlich unterstützen for-Schleifen break mit Rückgabewerten, sodass die Schleife selbst als Ausdruck verwendet werden kann, der früh mit einem sinnvollen Ergebnis endet. for-Ausdrücke unterstützen mehrere break-Werte.
Beispiel: die erste Zahl größer als 10 finden:
first_large = for n in *numbers break n if n > 10first_large = for n in *numbers break n if n > 10Diese break-mit-Wert-Syntax ermöglicht knappe und ausdrucksstarke Such- bzw. Early-Exit-Muster direkt in Schleifenausdrücken.
key, score = for k, v in pairs data break k, v * 10 if k == "target"key, score = for k, v in pairs data break k, v * 10 if k == "target"Du kannst Werte auch filtern, indem du den for-Ausdruck mit continue kombinierst.
for-Schleifen am Ende eines Funktionsrumpfs werden nicht in eine Tabelle für einen Rückgabewert gesammelt (stattdessen gibt die Funktion nil zurück). Du kannst entweder explizit return verwenden oder die Schleife in eine Listen-Comprehension umwandeln.
func_a = -> for i = 1, 10 do print ifunc_b = -> return for i = 1, 10 do i
print func_a! -- gibt nil ausprint func_b! -- gibt Tabellenobjekt ausfunc_a = -> for i = 1, 10 do print ifunc_b = -> return for i = 1, 10 do i
print func_a! -- gibt nil ausprint func_b! -- gibt Tabellenobjekt ausDas verhindert die unnötige Erstellung von Tabellen in Funktionen, die die Ergebnisse der Schleife nicht zurückgeben müssen.