イテレータ(続き)

javascript

概要

前回投稿した反復処理のイテレータについて引き続き試してみます。
イテレータはコレクションに対してループ処理をする際、次の値が存在しない場合はStopIterationがスローされます。

前回試したイテレータのサンプルを少し改造して、次のようなコードを書きました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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を決める仕様のほうが安全と言えます。

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

コメントを残す

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