-
[Functional] 제네레이터와 이터러블programing/Language 2019. 7. 15. 17:37
안녕하세요, Einere입니다.
(ADblock을 꺼주시면 감사하겠습니다.)
2019/07/15 - [programing/JavaScript] - [Functional] 순회와 이터러블
제네레이터
function *gen() { yield 1; yield 2; yield 3; // 반환값은 {value, done}객체에서, done이 ture가 될 때의 value값이다 // 따라서, 일반적인 순회에서 등장하지 않는 값이다 return 100; } const iter1 = gen(); const iter2 = gen(); for(const e of iter1) console.log(e); // 1 2 3 출력 console.log(iter2.next()); // {value: 1, done: false} 출력 console.log(iter2.next()); // {value: 2, done: false} 출력 console.log(iter2.next()); // {value: 3, done: false} 출력 console.log(iter2.next()); // {value: 100, done: true} 출력 console.log(iter[Symbol.iterator]() === iter); // true 출력
이터레이터면서, 잘 정의된 이터레이터를 생성 및 반환하는 함수입니다.
함수명에 *를 붙여 제네레이터임을 명시할 수 있으며, 편하게 이터레이터를 만들 수 있습니다.
yield는 표현식이며, JS에서 표현식은 값으로 평가되므로, yield 표현식 또한 값으로 평가됩니다.
응용
// 입력받은 수부터 무한히 순회하는 이터레이터를 반환하는 제네레이터 function *infinity(start = 0) { while(true) yield start++; } // 한계와 이터레이터를 받아, 한계까지 받은 이터레이터를 순회하는 이터레이터를 반환하는 제네레이터 function *limit(limit, iter) { for(const e of iter) { yield e; // return을 만나면 더이상 해당 이터레이터로 순회할 수 없습니다 if(e === limit) return; } } // 지정된 범위 내의 홀수를 순회하는 이터레이터를 반환하는 제네레이터 function *odds(start, end) { for(const e of limit(end, infinity(start))) if(e % 2) yield e; } for(const e of odds(10, 100)) console.log(e); // 11 13 15 ... 99 출력 console.log(...odds(5, 10)); // 5 7 9 출력 console.log([...odds(1, 10), ...odds(11, 20)]); // [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 출력 const [start, ...end] = odds(23, 34); console.log(start, end); // 23, [25, 27, 29, 31, 33] 출력
지정된 범위 내의 홀수를 순회하는 이터레이터를 반환하는 제네레이터를 만들었습니다.
참고
마이클 포거스, 『함수형 자바스크립트 : 새롭고 올바른 자바스크립트 프로그래밍 기법』, 한빛미디어(2014).
유인동, 인프런 - 함수형 프로그래밍과 JavaScript ES6+
'programing > Language' 카테고리의 다른 글
[JS] JavaScript get call stack trace (0) 2019.07.16 [Functional] map, filter, reduce (0) 2019.07.15 [Functional] 순회와 이터러블 (0) 2019.07.15 [Functional] 평가와 일급, 고차함수 (0) 2019.06.25 [JS] 블로그 드래그 방지 해제 (0) 2019.06.12 댓글