ジェネレータと反復

20879 ワード

はつでんき
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