each文
書式
each文は以下の形式です。
each ( コレクション式 )
...
endeach
each文はターゲットコレクションの要素を巡回します。全ての要素を巡回したら実行制御がendeachキーワードの次の文に移動します。
実行制御がcontinue文かendeachキーワードに達した場合、実行制御がコレクション式の次の文に移動します。
実行制御がbreak文に達した場合、実行制御がendeachキーワードの次の文に移動します。
ターゲットコレクションが空の場合、each文は実行されません。
each文の実行中にターゲットコレクションを操作した結果は未定義です。何が起こるかわかりません。
each
each文である事を示すキーワードです。
コレクション式
コレクション式はeach文のターゲットコレクションを決定します。コレクションクラスのインスタンスを返さなければなりません。
コレクションクラスは以下のクラスです。
これらに{}を使用したクラス。
ループの手順
♦1:コレクション式からターゲットコレクションを決定します。これは最初に一度だけ行われます。
♦2:巡回していない要素を取り出します。全ての要素を巡回していればendeachの次の文に実行制御を移動します。
♦3:each文の文が実行されます。
♦4:continue文かendeach に達したら♦2に戻ります。
巡回の順序
以下の順序で要素を巡回します。
listクラス:要素の追加順。
dictionaryクラス:要素の追加順。
queue クラス:Dequeue()メソッドで取り出す順序。
stack クラス:Pop()メソッドで取り出す順序。
スコープ
予約変数
実行制御がeachキーワードに到達するとスコープが生成され、予約変数__countと__indexが定義され、__keyと__valueが宣言されます。
__countと__indexはintクラスの変数でゼロから始まるループ回数で初期化されます。
__keyはstringクラスの変数でコレクション式の評価の後に初期化されます。ターゲットコレクションがdictionaryクラスの場合は要素のkeyで初期化されます。それ以外の場合は空文字列です。
__valueの型はターゲットコレクションの要素に依存します。コレクション式の評価の後にターゲットコレクションの要素で初期化されます。
__countと__indexは通常のintクラスのようにオーバーフローが発生することはありません。int クラスの最大値を超えた場合は自動的にゼロに戻ります。
each文のコレクション式の評価の際には既にスコープが生成されています。したがって、コレクション式の中に予約変数を使用した場合、その予約変数は現在のkeepon文が定義したものです。
__keyと__valueはコレクション式に使用しないでください。例外が発生します。
文
each文の文はオプションです。each 文内に任意の数だけ存在できます。
endeach
each文の終了を示すキーワードです。
endeachの代わりに省略形のeeを使用できます。eeもキーワードであることに注意してください。
例
1: | class example |
2: | open method void someMethod() |
3: | message m; // dialog box. |
4: | list{int} il = new list{int}("{1, 2, 3, 4, 5}"); |
5: | each (il) |
6: | m.Show(__value); // 1, 2, 3, 4, 5 |
7: | endeach |
8: | em |
9: | ec |