Linguagem avançada · unidade 15 de 27

Iterables e generators

Produza dados sob demanda.

8 min de leitura · 7 cards · 16 exercícios

Card 1 de 7: Iterables e generators01 / 07

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

exemplo.js
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.

Fundamentalexercício 01 / 16

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.

ponto de partida
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

  1. 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
  2. 02Salve sua implementação em exercises.js, na mesma pasta do teste.
  3. 03Abra o terminal nessa pasta e execute o comando abaixo.
  4. 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="createRangeIterable" exercises.test.js

Comportamentos 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

Esta área permanece livre em todos os exercícios. O código atual da unidade aparece abaixo para comparação com os testes e casos esperados.
código disponível
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 };
        },
      };
    },
  };
}