ジェネレータと反復
20879 ワード
はつでんき
iteratorとiterableを生成する関数
巡回する値を文で表す
どんな価格でも巡回できます!
next()関数を使用すると、return値がdone値に含まれます.
forのように、展開演算子、構造分解、および他の演算子もジェネレータ関数を使用できます.
https://valuefactory.tistory.com/284
iteratorとiterableを生成する関数
巡回する値を文で表す
どんな価格でも巡回できます!
function *generataor() {
yield 1;
yield 2;
yield 3;
}
let iter = generataor();
console.log(iter[Symbol.iterator]() == iter); // true
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 2, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: undefined, done: true}
サードパーティ関数で返される場合、最後のvalueには返される値が含まれます.function *generataor() {
yield 1;
yield 2;
yield 3;
return 100;
}
let iter = generataor();
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 2, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: 100, done: true}
通常のfor文では、戻り値は出力されません.next()関数を使用すると、return値がdone値に含まれます.
function *generataor() {
yield 1;
yield 2;
yield 3;
return 100;
}
let iter = generataor();
for(const a of generataor()) console.log(a);
1
2
3
例)奇数出力を作成するジェネレータ関数function *odds(n) {
for(let i=0; i<n; i++) {
if(i % 2) yield i;
}
}
let iter = odds(10);
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: 5, done: false}
console.log(iter.next()); // {value: 7, done: false}
console.log(iter.next()); // {value: 9, done: false}
上記の例では、より深いコードで記述します.function *infinity(i=1) {
while(true) yield i++;
}
function *odds(l) {
for(const a of infinity(1)) {
if(a % 2) yield a;
if(a == l) return;
}
}
let iter = odds(10);
console.log(iter.next()); // {value: 1, done: false}
console.log(iter.next()); // {value: 3, done: false}
console.log(iter.next()); // {value: 5, done: false}
console.log(iter.next()); // {value: 7, done: false}
console.log(iter.next()); // {value: 9, done: false}
for...of,展開演算子,構造分解,残余演算子forのように、展開演算子、構造分解、および他の演算子もジェネレータ関数を使用できます.
function *odds(n) {
for(let i=0; i<n; i++) {
if(i % 2) yield i;
}
}
// 전개 연산자
console.log(...odds(10));
console.log([...odds(10), ...odds(20)]);
// 1 3 5 7 9
// [1, 3, 5, 7, 9, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
// 구조 분해
let [start, ...end] = odds(10);
console.log(start);
console.log(end);
// 1
// [3, 5, 7, 9]
// 나머지 연산자
let [a, b, ...rest] = odds(10);
console.log(a);
console.log(b);
console.log(rest);
// 1
// 3
// [5, 7, 9]
コメントサイトhttps://valuefactory.tistory.com/284
Reference
この問題について(ジェネレータと反復), 我々は、より多くの情報をここで見つけました https://velog.io/@minidoo/generator와-iteratorテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol