Linguagem avançada · unidade 15 de 27
Iterables e generators
Produza dados sob demanda.
01 / 07Use as setas do teclado ou deslize
Leitura
O protocolo de iteração e pipelines lazy que evitam materializar coleções inteiras na memória.
No backend, esse fundamento aparece quando o código transforma entrada em decisão. O detalhe de linguagem deixa de ser acadêmico no momento em que altera um payload, uma regra de negócio ou a forma como uma falha chega à camada seguinte.
A forma mais útil de estudar é ligar a sintaxe a um contrato observável: o que entra, o que pode mudar, qual resultado sai e qual erro deve continuar o fluxo. É esse raciocínio que os exemplos e exercícios desta unidade procuram treinar.
Código
function* ids() {
let id = 1
while (true) yield id++
}O que fica
- Symbol.iterator separa produção e consumo.
- Yield pausa e retoma uma execução.
- Fontes infinitas são seguras quando o consumidor impõe limite.
Prática guiada.Leia, rode, quebre e explique cada exercício.
Prática guiada / unidade 15
Um problema de cada vez.
Leia o contrato, escreva sua tentativa e confira os casos esperados. A resolução de referência permanece visível ao final de cada exercício.
createRangeIterable(start, end)
01 / Entenda
Enunciado
retorna um objeto que
implementa o protocolo de iteração manualmente (sem function*):
define [Symbol.iterator]() retornando um objeto com next() que
devolve { value, done }. Já implementado como exemplo.
02 / Implemente
Sua tentativa
Comece pela assinatura e resolva sem olhar a resposta.
function createRangeIterable(start, end) {
// Escreva sua solução aqui.
}03 / Preveja
Entrada e saída
Use estes exemplos para entender o contrato antes de programar.
Entrada / chamada
createRangeIterable(1, 5)Retorno esperado
[1, 2, 3, 4, 5]Entrada / chamada
createRangeIterable(3, 3)Retorno esperado
[3]04 / Teste
Prove que funciona
O teste chama sua função e compara o resultado real com o esperado.
Como utilizar este teste
- 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
- 02Salve sua implementação em
exercises.js, na mesma pasta do teste. - 03Abra o terminal nessa pasta e execute o comando abaixo.
- 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="createRangeIterable" exercises.test.jsComportamentos cobertos
- objeto iterável manual com Symbol.iterator
Ver código completo do teste
test("createRangeIterable: objeto iterável manual com Symbol.iterator", () => {
assert.deepEqual([...createRangeIterable(1, 5)], [1, 2, 3, 4, 5]);
assert.deepEqual([...createRangeIterable(3, 3)], [3]);
});05 / Compare
Resolução
function createRangeIterable(start, end) {
return {
[Symbol.iterator]() {
let current = start;
return {
next() {
if (current <= end) {
return { value: current++, done: false };
}
return { value: undefined, done: true };
},
};
},
};
}