Capítulo 06

De Guru-SP

O yield é tão poderoso quanto poderia ser. Ele, junto a parâmetros, possibilita combinações incrivelmente robustas. Veja nosso exemplo abaixo:

# Recebe dois valores e incrementa de 1 em 1
# até o máximo
def incrementa_um(valor_inicial, valor_final)
   while valor_inicial <= valor_final
      # recebemos um bloco?
      if block_given?
         # vamos então executar o bloco
         yield valor_inicial
      end
      # incrementando...
      valor_inicial = valor_inicial + 1
   end
   return valor_inicial
end

# Chamando com um bloco
incrementa_um(1, 5) { |arg| puts("Atual: " + arg.to_s + "\n") }

# Chamando sem um bloco
resultado = incrementa_um(1, 20)
puts("O valor no final da execução é: " + resultado.to_s)

E o resultado da execução:

$ ruby 05.rb
Atual: 1
Atual: 2
Atual: 3
Atual: 4
Atual: 5
O valor no final da execução é: 21

Veja o poder dos blocos: com uma chamada diferente foi possível criar duas saídas completamente diferentes. Claro, esse método é inútil, você provavelmente nunca fará algo desse tipo (um método que incremente um número), mas para fins de demonstração é excelente.

Abaixo modifiquei um pouco o código para tratar com dois parâmetros:

# Recebe dois valores e incrementa de 1 em 1
# até o máximo
def incrementa_um(valor_inicial, valor_final)
   while valor_inicial <= valor_final
      # recebemos um bloco?
      if block_given?
         # vamos então executar o bloco
         yield valor_inicial, valor_final
      end
      # incrementando...
      valor_inicial = valor_inicial + 1
   end
   return valor_inicial
end

# Chamando com um bloco
incrementa_um(1, 5) { |arg1,arg2| puts(arg1.to_s + " - " + arg2.to_s + "\n") }

# Chamando sem um bloco
resultado = incrementa_um(1, 20)
puts("O valor no final da execução é: " + resultado.to_s)

E a saída:

$ ruby 05.rb
1 - 5
2 - 5
3 - 5
4 - 5
5 - 5
O valor no final da execução é: 21 




Voltar para o tutorial de Ruby, ou ir para o Capítulo 07.

Ferramentas pessoais