For-loop

Repeats one or more statements once for each key-value pair in an object.

For Value1 , Value2 in Expression

パラメータ

Value1, Value2

型:変数

各反復の最初に列挙者が返す値を格納するための変数です。これらの値の性質は、Expressionによって決定される列挙子によって定義されます。これらの変数は動的にはありえない。

ループが切れたり終了したりすると、これらの変数は元の値に戻されます。ループ変数がByRef パラメータである場合、対象変数はループの影響を受けません。また、その変数を参照するクロージャ(ローカルな場合)も影響を受けず、ループの外でその変数が持っていた値だけを見ることができます。

注:ループ本体内で定義されていても、ループ変数を参照するネストされた関数は、現在の反復の値を見たり変更したりすることはできません。代わりに、変数を明示的に渡すか、その値をパラメータにバインドしてください。

列挙者がサポートしている場合、最大19個の変数がサポートされます。

変数は省略可能です。例えば、myMapのvalueに対してmyMapのenumeratorを第2パラメータのみで呼び出し、第1パラメータを省略します。列挙者がユーザー定義で、パラメータが必須である場合は、通常通り例外が発生します。Enumに渡されるパラメータカウントは、変数やカンマがない場合は0、ない場合は1にカンマの数を加えたものになります。

型:Object

列挙可能なオブジェクトをもたらす、または列挙可能なオブジェクトを含む変数。

備考

パラメータリストは、オプションで括弧で囲むことができます。事例:for (val in myarray)

列挙の流れは以下の通りです:

for-loopと厳密に同じではありませんが、以下のようにこの処理を実演しています:

_enum := Expression
try _enum := _enum.__Enum(2)
while _enum(&Value1, &Value2)
{
    ...
}

上記のコードと同様に、Expressionまたは__Enumが呼び出すことのできない値を生成した場合、例外がスローされます。

プロパティ、メソッド、配列の要素を列挙している間、そのタイプの項目を挿入したり削除したりすることは一般的に安全ではありません。そのため、一部の項目がスキップされたり、複数回列挙されたりすることがあります。回避策として、削除するアイテムのリストを作成し、最初のループが完了した後に2番目のループでアイテムを削除する方法があります。

forループの後には、通常、ループの本体を形成するステートメントの集合体であるブロックが続きます。ただし、1つの文しかないループにはブロックは必要ありません("if"とその "else"は、この目的のために1つの文としてカウントされます)。オプションで、オープンブレースを下ではなく同じラインに表示させるOTB(One True Brace)スタイルを採用することも可能です。事例:for x, y in z {.

すべてのループと同様に、BreakContinueA_Indexを使用することができます。

ループの後にElse文が続くこともあり、ループの反復回数がゼロの場合に実行されます。

COM Objects

Value1Value2は列挙者に直接渡されるため、どのような値が割り当てられるかは、列挙されるオブジェクトの種類に依存します。COM オブジェクトの場合、Value1にはIEnumVARIANT::Next()が返す値が、Value2にはそのバリアントタイプを表す数値が含まれます。例えば、Scripting.Dictionaryオブジェクトで使用する場合、各Value1には辞書のキーが含まれ、Value2は通常、文字列の場合は8、整数の場合は3です。タイプコードの一覧はComObjTypeを参照してください。

SafeArrayを列挙する場合、Value1には現在の要素が、Value2にはそのバリアントタイプが含まれる。

Enumerator object, OwnProps, While-loop, Loop, Until, Break, Continue, Blocks

オブジェクトが所有するプロパティを一覧表示します。

colours := {red:0xFF0000, blue:0x0000FF, green:0x00FF00}
; 上記の表現は、以下の「colors」の代わりに直接使用することができます:
s := ""
for k, v in colours.OwnProps()
    s .= k "=" v "`n"
MsgBox s

Shellオブジェクトを使用して、開いているすべてのExplorerおよびInternet Explorerのウィンドウを一覧表示します。

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

Defines an enumerator as a fat arrow function. フィボナッチ数列から、無期限または停止するまで数値を返します。

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

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

Defines an enumerator as a class. 前例に準ずる。

for n in FibC()
    if MsgBox("#" A_Index " = " n "`nContinue?",, "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
    }
}