イテレータ(続き)

javascript

概要

前回投稿した反復処理のイテレータについて引き続き試してみます。
イテレータはコレクションに対してループ処理をする際、次の値が存在しない場合は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を決める仕様のほうが安全と言えます。

また、言語仕様として存在はしますが、使用については非推奨となっているので、注意が必要です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です