generatorを使ってiterableにする。
成果物
yield
基礎
概念 | 概要 |
---|---|
イテレータ | value とdone のプロパティをもったオブジェクトを返すnext() メソッドをもったオブジェクトのこと。 |
ジェネレータ | イテレータを返す関数。function* で実装する |
yield
はイテレータを返す。
function* itr() { yield 1; yield 2; } var i = itr(); console.log(i.next().value); console.log(i.next().value);
イテレータを返す関数をつくる。yield
function* itr() { yield 1; yield 2; } for (let i of itr()) { console.log(i); }
イテレータを返す関数を呼び出してそのまま返す。yield*
function* _itr() { yield 1; yield 2; } function* itr() { yield* _itr(); } for (let i of itr()) { console.log(i); }
return
のかわりにyield
するfunction
でなくfunction*
とするyield
関数を呼び出してその結果を返すにはyield*
とする
class で使う
イテレータを返すメソッドをつくる。yield
class C { * itr() { yield 1; yield 2; } } let c = new C(); for (let i of c.itr()) { console.log(i); }
イテレータを返すメソッドを呼び出してそのまま返す。yield*
class C { * _itr() { yield 1; yield 2; } * itr() { yield* this._itr(); } } let c = new C(); for (let i of c.itr()) { console.log(i); }
_itr()
のスコープをプライベートにする。
class C { * #_itr() { yield 1; yield 2; } * itr() { yield* this.#_itr(); } } let c = new C(); for (let i of c.itr()) { console.log(i); }
getterをつくる。
class C { get Itr() { return this.#_itr(); } * #_itr() { yield 1; yield 2; } * itr() { yield* this._itr(); } } let c = new C(); for (let i of c.itr()) { console.log(i); } for (let i of c.Itr) { console.log(i); }
所感
紛らわしい
関数・メソッド・getterを定義するとき、定義文の前後をどうすればいいか迷う。それぞれ以下のパターンがある。適切に選ばねばならない。
前
function
function*
*
get
get*
はsyntax errorになる。
後
return
yield
yield*
対象環境
- Raspbierry pi 4 Model B
- Raspberry Pi OS buster 10.0 2020-08-20 ※
- bash 5.0.3(1)-release
$ uname -a Linux raspberrypi 5.4.72-v7l+ #1356 SMP Thu Oct 22 13:57:51 BST 2020 armv7l GNU/Linux