-
Notifications
You must be signed in to change notification settings - Fork 7
iterator μ generator
iforget edited this page May 1, 2020
·
1 revision
- μ§κΈ μ΄λ μλμ§ νμ ν μ μκ² λλ μ± κ°νΌ κ°μ κ°λ
- μ΄ν°λ μ΄ν°κ° λκΉμ§ μ§ννλ©΄ λ€λ‘ λμκ° μ μμ
- λ 립μ . μ μ΄ν°λ μ΄ν°λ₯Ό λ§λ€λλ§λ€ μ²μμμ μμ
- λ€μ νλͺ©μΌλ‘ λμ΄κ°
- value : νλͺ©μ κ°
- done : λ§μ§λ§ νλͺ©μ λλ΄λ©΄ trueλ‘ λ°λ
const book = [
'1 page',
'2 page',
'3 page',
];
const it = book.values(); // μ΄ν°λ μ΄ν° μμ±
console.log(it.next()); //{ value : '1 page', done: false }
console.log(it.next()); //{ value : '2 page', done: false }
console.log(it.next()); //{ value : '3 page', done: false }
console.log(it.next()); //{ value : undefined, done: true }
console.log(it.next()); //{ value : undefined, done: true }- λͺ¨λ κ°μ²΄λ₯Ό μ΄ν°λ¬λΈ(iterable)κ°μ²΄λ‘ λ°κΏ μ μλ€
- ν΄λμ€μ Symbol.iterator μ¬λ³Ό λ©μλκ° μκ³ valueμ done νλ‘νΌν°λ₯Ό κ°μ§ κ°μ²΄λ₯Ό λ°ννλ nextλ©μλλ₯Ό κ°μ§ κ°μ²΄λ₯Ό λ°ννλ λ΄μ©μ ꡬν
class Log {
constructor() {
this.messages = [];
}
add(message) {
this.messages.push({message, timestamp: new Date()});
}
[Symbol.iterator]() {
let i = 0;
const messages = this.messages;
return {
next() {
if (i >= messages.length) {
return {value: undefined, done: true}
}
return {value: messages[i++], done: false}
}
}
}
}
const log = new Log();
log.add('first');
log.add('second');
log.add('third');
for (let entry of log) {
console.log(`${entry.message} @ ${entry.timestamp}`);
}- μ΄ν°λ μ΄ν°λ₯Ό μ¬μ©ν΄ μμ μ μ€νμ μ μ΄νλ ν¨μ
- νΈμΆ μ¦μ μ€νλμ§ μμΌλ©° μ΄ν°λ μ΄ν°λ₯Ό λ°ννλ€.
- ν¨μμ μ€νμ μ€κ°μ λ©μΆμλ€κ° λ€μ μ¬κ°ν μ μλ€.
- next() λ©μλλ₯Ό μ€ννλ©΄ μ λλ μ΄ν° ν¨μ λ°λλ₯Ό μ€ννλ€κ° yieldλ₯Ό λ§λλ©΄ λ°λ‘ μ€μ§νκ³ yieldλ κ° λ°ν
- function ν€μλ λ€μ μ μ€ν°λ¦¬μ€ν¬ (*)λ₯Ό λΆμ
function* rainbow(){
yield 'red';
yield 'orange';
yield 'yellow';
yield 'green';
yield 'blue';
yield 'indigo';
yield 'violet';
}
const it = rainbow();
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());
/*
result :
{ value: 'red', done: false }
{ value: 'orange', done: false }
{ value: 'yellow', done: false }
{ value: 'green', done: false }
{ value: 'blue', done: false }
{ value: 'indigo', done: false }
{ value: 'violet', done: false }
{ value: undefined, done: true }
*/
```javascript
### μλ°©ν₯ ν΅μ
```javascript
function* interrogate(){
const name = yield 'What is your name?';
const color = yield 'What is your favorite color?'
return `${name}'s favorite color is ${color}`;
}
const it = interrogate();
console.log(it.next());
console.log(it.next('Peter'));
console.log(it.next('Blue'));
result :
{ value: 'What is your name?', done: false }
{ value: 'What is your favorite color?', done: false }
{ value: 'Peter\'s favorite color is Blue', done: true }- μ λλ μ΄ν°μμ 리ν΄μ μ¬μ©νλ©΄ μμΉμ κ΄κ³μμ΄ doneμ΄ trueκ° λκ³ value νλ‘νΌν°λ 리ν΄μ΄ λ°ννλ κ°μ΄ λ¨
- μ λλ μ΄ν°λ₯Ό μ¬μ©ν λ doneμ΄ trueκ° λλ©΄ value νλ‘νΌν°μ μ κ²½μ°μ§ μκ²λ¨ (ex. for...of 루νμμ λ§μ§λ§ 리ν΄μ μΆλ ₯λμ§ μμ)
function* genFunc(){
yield 1;
yield 2;
yield 3;
return 4;
}
let gen = genFunc();
for(let it of gen){
console.log(it);
}
function* genFunc(){
yield 1;
yield 2;
yield 3;
}
let gen = genFunc();
console.log(gen.next());
console.log(gen.return(22));
console.log(gen.next());