このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
js:iteration_protocols [2021/07/05 14:03] tanaka [イテレーター] |
js:iteration_protocols [2021/07/12 13:38] (現在) tanaka [ジェネレーター] |
||
|---|---|---|---|
| 行 55: | 行 55: | ||
| ===== ジェネレーター ===== | ===== ジェネレーター ===== | ||
| - | > TODO: | + | ジェネレーターは数列などの列挙可能な値(オブジェクト)を、次々と生成し、'' |
| + | 以下にジェネレーターの簡単な例を示します。 | ||
| + | |||
| + | <sxh javascript; | ||
| + | class Student { | ||
| + | // コンストラクタの定義 | ||
| + | constructor(name) { | ||
| + | this.name = name; | ||
| + | } | ||
| + | |||
| + | // メソッドの定義 | ||
| + | greeting() { | ||
| + | console.log(`I am ${this.name}.`); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | function* getStudents() { | ||
| + | yield new Student(' | ||
| + | yield new Student(' | ||
| + | yield new Student(' | ||
| + | } | ||
| + | |||
| + | for (let student of getStudents()) { | ||
| + | student.greeting(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 最初にジェネレーター関数が呼び出されると、コードは実行されずイテレーターオブジェクトが返されます。このオブジェクトのことをジェネレーターと呼びます。その後、呼び出し側でジェネレーターの '' | ||
| + | |||
| + | 別の例として、2000年から2100年までの閏年を計算するコードを、以下に示します。 | ||
| + | |||
| + | <sxh javascript; | ||
| + | function* genLeapYear(start_year) { | ||
| + | let year = start_year; | ||
| + | while(true) { | ||
| + | if(isLeapYear(year)) { | ||
| + | yield year; | ||
| + | } | ||
| + | year++; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | function isLeapYear(year) { | ||
| + | return (year % 400 == 0) || | ||
| + | (year % 100 != 0 && year % 4 == 0); | ||
| + | } | ||
| + | |||
| + | for (let year of genLeapYear(2000)) { | ||
| + | if(year > 2100) break; | ||
| + | console.log(year); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 上の例はジェネレーターがなぜ使われるのかを端的に示しています。この例から分かるように、ジェネレーターを使用することにより全ての計算結果が格納された配列を用意する必要がなくなります。また、計算の終了を関数の呼び出し側で行うこともできます。 | ||
| + | |||
| + | \\ | ||