概要
前回投稿した反復処理のイテレータについて引き続き試してみます。
イテレータはコレクションに対してループ処理をする際、次の値が存在しない場合はStopIterationがスローされます。
前回試したイテレータのサンプルを少し改造して、次のようなコードを書きました。
[js]
function test2(start, end) {
let sv = start;
return {
next: function() {
if (sv > end) {
throw StopIteration;
} else {
return sv++;
}
}
};
}
//イテレータに対し引数を2つ設定し定義
let testval2 = test2(100, 105);
//定義したイテレータ内のnextを呼び出す
try {
console.log(testval2.next());
} catch(e) {
console.log(e);
}
try {
console.log(testval2.next());
} catch(e) {
console.log(e);
}
try {
console.log(testval2.next());
} catch(e) {
console.log(e);
}
try {
console.log(testval2.next());
} catch(e) {
console.log(e);
}
[/js]
イテレータ内のnext()で、test2の第一引数と第二引数で開始値と終了値を指定し、
イテレータが呼ばれる回数が終了値(=endの値)を超えた時に例外「StopIteration」をスローしています。
ループ処理でtry catchを呼ぶ形のほうがコードの量が少なく綺麗になりますが、
※・・・上記のサンプルは挙動を確かめる(エラー発生行数)為にループはしていません。
注意点
イテレータ側で配列を扱う場合は、終わりの値が正しく設定されている場合は問題はないですが、
無限サイズの配列の場合は、際限なく処理されてしまいます。
実行時のメモリ消費に影響する為、startとendを決める仕様のほうが安全と言えます。
また、言語仕様として存在はしますが、使用については非推奨となっているので、注意が必要です。