Iteradores
Agora vamos entrar numa das características mais legais de Ruby: iteradores .
Um iterador é um tipo especial de método. Trata-se de um método que permite a você acessar um item de cada vez.
Arrays não são os únicos objetos que têm iteradores, mas são os mais importantes. Iteradores são melhores vistos através de exemplos. Aqui nós usamos Array#each:
friends = ["Melissa", "Jeff", "Ashley", "Rob"]
friends.each do |friend|
puts "I have a friend called " + friend
end
|
Isso vai produzir :
I have a friend called Melissa
I have a friend called Jeff
I have a friend called Ashley
I have a friend called Rob
|
O aprendiz mais interessado poderá notar que esta aparência é muito semelhante à do primeiro laço que mostramos. O outro tem a forma n.times do ... Trata-se, na verdade, de um iterador. E ele permite que você use sobre os inteiros de 0 a n-1:
4.times do |num|
puts num
end
|
O que produzirá :
0
1
2
3
|
O fato de começar a contagem a partir de 0 pode parecer estranha. Mas, na verdade, isso combina com matrizes (que começam contando de 0). Assim, o código fica:
friends = ["Melissa", "Jeff", "Ashley", "Rob"]
friends.each do |friend|
puts "I have a friend called " + friend
end
|
Também pode ser escrito como:
# 'i' is a standard notation for 'index'.
4.times do |i|
puts "I have a friend called " + friends[i]
end
|
Agora, aqui está algo legal: Lembra do método Array#length ?
friends.length.times do |i| # 'i' for 'index'.
puts "I have a friend called " + friends[i]
end
|
Agora, suponha que eu não queira imprimir todos os meus amigos. Quero apenas imprimir outros amigos. Nós podemos imprimir os amigos que correspondam a determinados índices numerados. Podemos fazê-lo com método remanescente (Integer#%). Este código vai mostrar apenas nomes com índices ímpares.
friends.length.times do |i|
# Print only even indices (i.e. remainder with 2 is 0).
if i % 2 == 0
puts "I have a friend called " + friends[i]
end
end
|
Isso produz :
I have a friend called Melissa
I have a friend called Ashley
|
Agora, quero imprimir o nome de meus amigos em ordem alfabética:
friends.sort.each do |friend|
puts "I have a friend called " + friend
end
|
Vai produzir :
I have a friend called Ashley
I have a friend called Jeff
I have a friend called Melissa
I have a friend called Rob
|
Exercícios
1- Imprima todo o conteúdo de friends com ordem alfabética inversa.
2- Imprima uma música qualquer usando um iterador.
3- Tenho o seguinte array :
names = [ "daniel", "eduardo", "alejandro", "enrique" ]
|
Use o método String#capitalize para imprimir estes nomes com inicial maiúscula.