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.classUsando 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.classOrientando 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).totalSequê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 }
putsReunindo tudo
Um each personalizado oferece controle total da iteração:
yielduma vez por elemento.- Percorra em qualquer ordem, gere valores ou forneça pares.
- Retorne
selfpor 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:
yieldpassa elementos ao bloco do chamador.- O senhor controla a ordem do percurso e pode gerar valores.
- Retorne
selfpor 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
- Escrevendo um each personalizado
- Incluindo Enumerable
- Enumeradores preguiçosos
- Objetos enumeradores