0Pricing
Ruby Academy · Aula

Escrevendo um each personalizado

Implemente a iteração.

Escrevendo um each personalizado é uma aula grátis de Ruby Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Ruby Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Ruby Academy inclui 4 aulas no total.

Implementando a iteração

A iteração em Ruby gira em torno de um único método: each. Ao escrever seu próprio each, o senhor decide como uma coleção será percorrida e desbloqueia todo o ecossistema de iteração.

class Trio
  def each
    yield 1
    yield 2
    yield 3
  end
end
Trio.new.each { |n| puts n }

each fornece valores

Dentro de each, chame yield uma vez por elemento. O bloco fornecido pelo chamador recebe cada valor, um de cada vez.

class Days
  NAMES = ["Mon", "Tue", "Wed"]
  def each
    NAMES.each { |d| yield d }
  end
end
Days.new.each { |day| puts day }

Armazenando dados internos

Normalmente, each percorre dados mantidos em uma variável de instância.

class Stack
  def initialize
    @items = []
  end
  def push(x); @items << x; self; end
  def each
    @items.each { |i| yield i }
  end
end
s = Stack.new
s.push(10).push(20)
s.each { |x| puts x }

Ordem de percurso personalizada

Seu each pode iterar na ordem que o senhor quiser, por exemplo, na ordem inversa.

class Reversed
  def initialize(arr); @arr = arr; end
  def each
    i = @arr.length - 1
    while i >= 0
      yield @arr[i]
      i -= 1
    end
  end
end
Reversed.new([1, 2, 3]).each { |x| puts x }

Fornecendo vários valores

yield pode passar mais de um valor, que o bloco recebe como vários parâmetros, como a chave e o valor de um dicionário.

class Pairs
  def each
    yield :a, 1
    yield :b, 2
  end
end
Pairs.new.each { |key, value| puts "#{key}=#{value}" }

each retorna self

Por convenção, each retorna a própria coleção para que as chamadas possam ser encadeadas. Retornar self de each corresponde ao comportamento integrado.

class Box
  def initialize(*x); @x = x; end
  def each
    @x.each { |i| yield i }
    self
  end
end
result = Box.new(1, 2).each { |i| }
puts result.class

Usando block_given?

Proteja-se contra a ausência de um bloco para que um each sem argumentos não cause uma falha, geralmente retornando um enumerador, assunto abordado mais adiante.

class List
  def initialize(*x); @x = x; end
  def each
    return @x.to_enum unless block_given?
    @x.each { |i| yield i }
  end
end
puts List.new(5, 6).each.class

Orientando outros métodos

Depois que each existir, o senhor poderá criar outros métodos com base nele dentro da mesma classe.

class Numbers
  def initialize(*n); @n = n; end
  def each; @n.each { |i| yield i }; end
  def total
    sum = 0
    each { |i| sum += i }
    sum
  end
end
puts Numbers.new(1, 2, 3, 4).total

Sequências calculadas

each não precisa armazenar nada; ele pode gerar valores dinamicamente.

class Evens
  def initialize(limit); @limit = limit; end
  def each
    n = 0
    while n <= @limit
      yield n
      n += 2
    end
  end
end
Evens.new(8).each { |x| puts x }

A base de Enumerable

Seu each é o único bloco de construção de que Enumerable precisa. Na próxima lição, o senhor o incluirá e obterá dezenas de métodos gratuitamente.

class Range3
  def each
    (1..3).each { |n| yield n }
  end
end
Range3.new.each { |n| print n }
puts

Reunindo tudo

Um each personalizado oferece controle total da iteração:

  • yield uma vez por elemento.
  • Percorra em qualquer ordem, gere valores ou forneça pares.
  • Retorne self por convenção.
class Countdown
  def initialize(from); @from = from; end
  def each
    @from.downto(1) { |n| yield n }
  end
end
Countdown.new(3).each { |n| puts n }

Verificação rápida

Teste sua compreensão de each personalizado.

Recapitulação

O senhor aprendeu a escrever um each personalizado:

  • yield passa elementos ao bloco do chamador.
  • O senhor controla a ordem do percurso e pode gerar valores.
  • Retorne self por convenção.
  • each é a base de Enumerable.
class Squares
  def initialize(n); @n = n; end
  def each
    (1..@n).each { |i| yield i * i }
  end
end
Squares.new(4).each { |sq| puts sq }

Perguntas Frequentes

A aula “Escrevendo um each personalizado” é grátis?

Sim — o texto completo de “Escrevendo um each personalizado” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Ruby Academy, atualize para CoddyKit PRO. O curso de Ruby Academy inclui 4 aulas no total.

O que vou aprender em “Escrevendo um each personalizado”?

Implemente a iteração. Você pratica Ruby Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Ruby Academy?

Nenhuma experiência prévia é necessária. Ruby Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Escrevendo um each personalizado”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Ruby Academy?

Sim. Cada aula de Ruby Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Escrevendo um each personalizado
  2. Incluindo Enumerable
  3. Enumeradores preguiçosos
  4. Objetos enumeradores
← Voltar para Ruby Academy