Blocos

Um bloco em Ruby é caracterizado pelo uso das palavras chaves do e end ou pelo uso de chaves {}.

Vamos usar blocos para percorrer Arrays e Hashes.

numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

puts numeros.size
# => 12

numeros.each do |numero|
  puts "#{numero} é par" if numero % 2 == 0
end

O mesmo código pode ser escrito em uma linha:

numeros.each { |numero| puts "#{numero} é par" if numero % 2 == 0 }

each é um método que itera numa Array ou num Hash. numero é a variável de iteração. Ou seja, a cada iteração, numero passará a ter em seu conteúdo o mesmo conteúdo da array numeros em uma posição específica.

Note que a estrutura de repetição for funciona bem nesse caso, porém temos que especificar a quantidade de elementos na array.

tamanho = numeros.size

for numero in (1 .. tamanho) do
  if numero % 2 == 0
    puts "#{numero} é par"
  end
end

Vejamos um exemplo com um Hash:

pessoa = {nome: 'Rafael', idade: 20, curso: 'BCC'}

pessoa.each do |chave, valor|
  puts "#{chave}: #{valor}"
end

Observe que temos duas variáveis de iteração, chave e valor. A cada iteração um par chave-valor do Hash é selecionado e os seus dados de chave e valor são copiados para as variáveis de iteração.

Poderíamos usar os métodos each_key e each_value para iterar em chaves e valores, somente, respectivamente.

pessoa.each_key do |chave|
  puts "#{chave}"
end

pessoa.each_value do |valor|
  puts "#{valor}"
end