やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

JSのyieldをgetterで使う

 generatorを使ってiterableにする。

成果物

yield

基礎

概念 概要
イテレータ valuedoneのプロパティをもったオブジェクトを返す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*

対象環境

$ uname -a
Linux raspberrypi 5.4.72-v7l+ #1356 SMP Thu Oct 22 13:57:51 BST 2020 armv7l GNU/Linux