Firefox 27(Nightly) の yield が { done, value } を返すようになった
ちょっと前に、Generator のプロトタイプ で書いたが、function * () { yield ...; }
な構文が導入された。
また、最近ユーザ作成の Generator.next() が { done: Boolean, value: Value }
なオブジェクトを返すように変更された。*1
function * gene () { for (var i = 0; i < 3; ++i) { yield i; } } var geneObj = gene(), done, value; while ({ done, value } = geneObj.next(), !done) { console.log(value); }
と、まぁこんな感じに書ける*2。
ただし
- この変更にfor-of等の構文が追いついていない
- ビルトインでgeneratorを返すものも、この仕様になっていない
- → ビルトインのgeneratorとfor-ofは正常動作する
ということで、Bugzilla へ報告済み
追記(2013-09-28)
Mozilla JavaScript 1.7 あたりから使える*
が付かない Generator の挙動は変更されていない様子。
function gene () { for (var i = 0; i < 3; ++i) { yield i; } } var geneObj = gene(); try { while (true) { console.log(geneObje.next()); } } catch (e) { console.error(e); } // 0 // 1 // 2 // [object StopIteration]
という結果になり、従来通りの挙動。
*
付きGenerator は最近実装されたばかりだし、Firefox内部やアドオンでも使われていないだろうから、何かが動かなくなったとかそういうのはないと思われる。
追記(2013-10-05)
により、修正された。
また、同時に、今まで iterator というメソッドがあると for-of 等で iterable だと判断されていたものが、この修正により "@@iterator" というメソッド名に代わった。
ES6 では @@*** なプロパティはSymbol型*3であるが、この修正ではまだ文字列であり、ECMAScript 6th valid な変更ではない点に注意。このあたり、Symbold オブジェクトが実装され次第、順次変わって行くと思われ、変更が目まぐるしい箇所になりそう。