0Pricing
Ruby Academy · Aula

Incluindo Enumerable

Obtenha map/select gratuitamente.

Incluindo Enumerable é uma aula grátis de Ruby Academy no CoddyKit. Esta é a aula 2 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.

Obtenha map/select gratuitamente

Quando sua classe tem each, incluir Enumerable oferece instantaneamente map, select, reduce, sort, min, max e muitos outros, todos baseados no seu each.

class Bag
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
p Bag.new(1, 2, 3).map { |n| n * 10 }

O contrato

O acordo é simples: inclua Enumerable e defina each. Enumerable chama seu each internamente para fornecer todo o restante.

class Squares
  include Enumerable
  def initialize(n); @n = n; end
  def each
    (1..@n).each { |i| yield i * i }
  end
end
p Squares.new(5).to_a

Filtrando com select

select mantém os elementos para os quais o bloco resulta em verdadeiro. reject faz o oposto.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
n = Nums.new(1, 2, 3, 4, 5, 6)
p n.select(&:even?)
p n.reject(&:even?)

Agregando com reduce

reduce combina a coleção em um único valor.

class Cart
  include Enumerable
  def initialize(*p); @p = p; end
  def each; @p.each { |i| yield i }; end
end
puts Cart.new(5, 10, 15).reduce(:+)

Mínimo, máximo e ordenação

Os métodos baseados em comparação funcionam desde que seus elementos sejam comparáveis.

class Scores
  include Enumerable
  def initialize(*n); @n = n; end
  def each; @n.each { |i| yield i }; end
end
s = Scores.new(7, 2, 9, 4)
puts s.min
puts s.max
p s.sort

Localização e verificação de pertencimento

find retorna o primeiro elemento correspondente; include? verifica o pertencimento.

class Words
  include Enumerable
  def initialize(*w); @w = w; end
  def each; @w.each { |x| yield x }; end
end
w = Words.new("cat", "dog", "bird")
puts w.find { |x| x.length == 4 }
puts w.include?("dog")

group_by e partition

Enumerable oferece auxiliares avançados para agrupamento.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
n = Nums.new(1, 2, 3, 4, 5)
p n.group_by(&:even?)
p n.partition(&:odd?)

A ordenação precisa de elementos comparáveis

Se seus elementos forem objetos personalizados, forneça <=> (por meio de Comparável) para que sort, min e max saibam como ordená-los.

Item = Struct.new(:price) do
  include Comparable
  def <=>(o); price <=> o.price; end
end
class Shelf
  include Enumerable
  def initialize(*i); @i = i; end
  def each; @i.each { |x| yield x }; end
end
shelf = Shelf.new(Item.new(30), Item.new(10), Item.new(20))
p shelf.min.price

Iteração com índice

Enumerable também fornece each_with_index e each_with_object para uma iteração mais rica.

class Letters
  include Enumerable
  def initialize(*l); @l = l; end
  def each; @l.each { |x| yield x }; end
end
Letters.new("a", "b", "c").each_with_index do |letter, i|
  puts "#{i}: #{letter}"
end

Encadeando métodos

Como esses métodos retornam vetores ou enumeradores, o senhor pode encadeá-los em fluxos de processamento expressivos.

class Nums
  include Enumerable
  def initialize(*x); @x = x; end
  def each; @x.each { |i| yield i }; end
end
result = Nums.new(1, 2, 3, 4, 5, 6).select(&:even?).map { |n| n * n }
p result

Reunindo tudo

Incluir Enumerable é uma grande vantagem:

  • Defina each uma vez.
  • Obtenha map, select, reduce, ordenação, localização, group_by e dezenas de outros.
  • Adicione Comparable aos elementos para obter métodos de ordenação.
class Range5
  include Enumerable
  def each; (1..5).each { |n| yield n }; end
end
puts Range5.new.sum

Verificação rápida

Teste sua compreensão da inclusão de Enumerable.

Recapitulação

O senhor aprendeu a incluir Enumerable:

  • Defina each, inclua o módulo e obtenha o conjunto completo de ferramentas.
  • map/select/reduce/localização/group_by usam seu each.
  • A ordenação dos elementos precisa de <=>.
  • Os métodos podem ser encadeados em fluxos de processamento.
class Tens
  include Enumerable
  def each; [10, 20, 30].each { |n| yield n }; end
end
p Tens.new.map { |n| n + 1 }

Perguntas Frequentes

A aula “Incluindo Enumerable” é grátis?

Sim — o texto completo de “Incluindo Enumerable” é 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 “Incluindo Enumerable”?

Obtenha map/select gratuitamente. 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 2 de 4.

Quanto tempo leva a aula “Incluindo Enumerable”?

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