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_aFiltrando 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.sortLocalizaçã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.priceIteraçã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}"
endEncadeando 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 resultReunindo tudo
Incluir Enumerable é uma grande vantagem:
- Defina
eachuma 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.sumVerificaçã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
- Escrevendo um each personalizado
- Incluindo Enumerable
- Enumeradores preguiçosos
- Objetos enumeradores