あなたはnumbers
に渡さ変換持って幸せだので、あなたは発電機であることnumbers
を利用する場合は、生成として、あなたはそれを適用することができます。
function* numbers(upto, transform) {
let n = 0;
while (n < upto) {
yield transform(n);
++n;
}
}
const timesTwo = n => n * 2;
const generator = numbers(31, timesTwo);
for (const i of generator) {
console.log(i); // 0 2 4 6 8... 60
}
ブラウザが上記を実行しないブラウザの場合はLive on Babel's REPLとなります。
我々はnumbers
のあなたの元の定義を使用することができますが、私たちは熱心に代わりのなまけ変換を適用する必要があるだろうか、私たちは(配列がすべて作成されます配列の反復子を使用する必要があると思います一度に関係なく)。ここでは後者の一つです:
function* numbers(upto, transform) {
for (const n of Object.keys([...Array(upto)])) {
yield transform(n);
}
}
const timesTwo = n => n * 2;
const generator = numbers(31, timesTwo);
for (const i of generator) {
console.log(i); // 0 2 4 6 8... 60
}
Live on Babel's REPL。
我々はそこnumbers
の二つの側面を分離し、基本的にmap
の発電機のバージョンである汎用transform
機能を持つことができます:
function* transform(iterable, f) {
for (const v of iterable) {
yield f(v);
}
}
その後、我々はより基本的にそれを使用することができますnumbers
:
function* transform(iterable, f) {
for (const v of iterable) {
yield f(v);
}
}
function* numbers(upto) {
yield* Object.keys([...Array(upto)]);
}
const timesTwo = n => n * 2;
const generator = transform(numbers(31), timesTwo);
for (const i of generator) {
console.log(i); // 0 2 4 6 8... 60
}
On Babel's REPL
サイドノート:私はあなたがこれを知っている確信しているが、任意の潜伏者は、問題のnumbers
[以下、これらのカップル]について一連の文字列を反復処理:"0"
、"1"
などです。しかし、それらを乗算すると、数値に強制されます。実際には、質問者のnumbers
アプローチに基づいた一連の番号を持っているために、我々は `transform`パラメータを使用すると、変換持って満足しているように、それが思われてしまうこと
yield* Object.keys([...Array(upto)]).map(Number));
を必要とするだろうそれらを外部で構成するのではなく、「数値」に渡したのは正しいのですか? –
はい。簡単な例を作成しようとしていましたが、何かが欠けていた可能性があります。 – Ben
この分野の私の理解を発展させる...IIUC 'yield *'は内側の 'iterable'の各値が返されることを意味します。これは、私が理解できる限り、単純な例に当てはまります。私は実際の例がメモリに収まらない大きすぎる数字のリストかもしれないと思います。 – Ben