For-Schleife

Führt für jedes Schlüssel-Wert-Paar eines Objekts wiederholt eine oder mehrere Anweisungen aus.

For Wert1 , Wert2 in Ausdruck

Parameter

Wert1, Wert2

Typ: Variable

Die Variablen, in denen die vom Enumerator zurückgegebenen Werte zu Beginn jeder Wiederholung gespeichert werden sollen. Der Typ dieser Werte wird durch den Enumerator definiert, der via Ausdruck ermittelt wird. Dynamische Variablen können nicht verwendet werden.

Wenn die Schleife unterbrochen wird oder ihr Ende erreicht hat, werden diese Variablen auf ihre vorherigen Werte zurückgesetzt. Wenn eine Schleifenvariable ein ByRef-Parameter ist, wird die Zielvariable durch die Schleife nicht beeinflusst. Closures, die die Variable referenzieren (falls lokal), sind ebenfalls nicht betroffen und sehen nur den Wert, den die Variable außerhalb der Schleife hatte.

Hinweis: Eine verschachtelte Funktion, die auf eine Schleifenvariable verweist, kann den Wert der aktuellen Wiederholung weder sehen noch ändern, selbst wenn sie innerhalb des Schleifenkörpers definiert ist. Stattdessen sollte die Variable explizit übergeben oder ihr Wert an einen Parameter gebunden werden.

Es werden bis zu 19 Variablen unterstützt, sofern vom Enumerator unterstützt.

Variablen können weggelassen werden. Zum Beispiel bewirkt for , Wert in meinMap, dass der Enumerator von meinMap nur mit seinem zweiten Parameter aufgerufen wird. Wenn der Enumerator benutzerdefiniert ist und der Parameter ein Pflichtparameter ist, wird wie üblich eine Ausnahme ausgelöst. Die Anzahl der an __Enum übergebenen Parameter ist 0, wenn keine Variablen oder Kommas vorhanden sind, andernfalls 1 plus die Anzahl der vorhandenen Kommas.

Ausdruck

Typ: Objekt

Ein Ausdruck, dessen Ergebnis ein enumerierbares Objekt ist, oder eine Variable, die ein enumerierbares Objekt enthält.

Bemerkungen

Die Parameterliste kann optional in runde Klammern gesetzt werden. Zum Beispiel: for (Wert in MeinArray)

Die Enumeration läuft wie folgt ab:

Das folgende Beispiel zeigt die ungefähre Funktionsweise einer For-Schleife:

_enum := Ausdruck
try _enum := _enum.__Enum(2)
while _enum(&Wert1, &Wert2)
{
    ...
}

Im obigen Code wird eine Ausnahme ausgelöst, wenn Ausdruck oder __Enum einen Wert zurückgibt, der nicht aufgerufen werden kann.

Beim Enumerieren von Eigenschaften, Methoden oder Arrayelementen ist es generell unsicher, Elemente dieser Art einzufügen oder zu entfernen. Würde man dies tun, könnte es passieren, dass einige Elemente übersprungen oder mehrfach enumeriert werden. Um das zu umgehen, können Sie z.B. eine Liste der zu entfernenden Elemente erstellen und dann nach Abschluss der ersten Schleife eine zweite Schleife verwenden, um die Elemente zu entfernen.

Nach einer For-Schleife folgt üblicherweise ein Block, eine Sammlung von Anweisungen, die den Körper der Schleife bilden. Für eine Schleife mit nur einer einzigen Anweisung ist jedoch kein Block erforderlich (ein "if" und dessen "else" werden in diesem Fall als Einzelanweisung behandelt). Der One True Brace (OTB) Style wird unterstützt, d.h. Sie können je nach Bedarf die geschweifte Startklammer am Zeilenende positionieren. Zum Beispiel: for x, y in z {.

Wie bei allen Schleifen können Break, Continue und A_Index verwendet werden.

Nach der Schleife kann optional eine Else-Anweisung angegeben werden, die ausgeführt wird, wenn die Schleife null Wiederholungen hatte.

COM-Objekte

Da Wert1 und Wert2 direkt an den Enumerator übergeben werden, hängen die zugewiesenen Werte davon ab, welche Art von Objekt enumeriert wird. Handelt es sich um ein COM-Objekt, enthält Wert1 den Rückgabewert von IEnumVARIANT::Next() und Wert2 eine Zahl, die seinen Variantentyp repräsentiert. Zum Beispiel wird bei Verwendung eines Scripting.Dictionary-Objekts jedes Wert1 einen Schlüssel aus dem Dictionary enthalten und Wert2 typischerweise 8 für Zeichenketten und 3 für Integer sein. Eine Auflistung aller Typennummern finden Sie unter ComObjType.

Beim Enumerieren eines SafeArrays enthält Wert1 das aktuelle Element und Wert2 seinen Variantentyp.

Enumerator-Objekt, OwnProps, While-Schleife, Loop, Until, Break, Continue, Blöcke

Beispiele

Listet die eigenen Eigenschaften eines Objekts auf.

Farben := {rot: 0xFF0000, blau: 0x0000FF, grün: 0x00FF00}
; "Farben" könnte direkt mit dem obigen Ausdruck ersetzt werden:
s := ""
for k, v in Farben.OwnProps()
    s .= k "=" v "`n"
MsgBox s

Listet alle geöffneten Explorer- und Internet-Explorer-Fenster unter Nutzung des Shell-Objekts auf.

windows := ""
for window in ComObject("Shell.Application").Windows
    windows .= window.LocationName " :: " window.LocationURL "`n"
MsgBox windows

Definiert einen Enumerator als Fat-Arrow-Funktion. Gibt Zahlen der Fibonacci-Folge zurück, entweder unendlich lang oder bis zum Abbruch der Schleife.

for n in FibF()
    if MsgBox("#" A_Index " = " n "`nWeiter?",, "y/n") = "No"
        break

FibF() {
    a := 0, b := 1
    return (&n) => (
        n := c := b, b += a, a := c,
        true
    )
}

Definiert einen Enumerator als Klasse. Äquivalent zum vorherigen Beispiel.

for n in FibC()
    if MsgBox("#" A_Index " = " n "`nWeiter?",, "y/n") = "No"
        break

class FibC {
    a := 0, b := 1
    Call(&n) {
        n := c := this.b, this.b += this.a, this.a := c
        return true
    }
}