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