Capítulo 05
De Guru-SP
Blocos são um dos recursos mais interessantes do Ruby, e provavelmente você fará muita coisa com eles. Os blocos possibilitam que, na chamada de um método, seja possível executar “mais alguma coisa”. Esse “mais alguma coisa” é executado através do comando yield. Veja nosso programa, modificado com uma chamada de bloco que imprime outra mensagem na tela:
def imprime_tudo(string_a_imprimir)
# Verifico se é da classe String
if string_a_imprimir.class == String
#executa o bloco antes do método
yield
#imprime tudo em maiúsculos
puts string_a_imprimir.upcase
#imprime tudo em minúsculos
puts string_a_imprimir.downcase
#imprime capitalizado
puts string_a_imprimir.capitalize
#imprime de trás pra frente
puts string_a_imprimir.reverse
else
puts string_a_imprimir
end
end
imprime_tudo(4) { }
imprime_tudo("Marcelo Castellani") { }
imprime_tudo("Vamos usar um bloco?") { puts "Esse é o bloco" }
A execução correta do código será a abaixo. Repare que o bloco foi executado EXATAMENTE onde espera-se que ele execute.
$ ruby 04.rb 4 MARCELO CASTELLANI marcelo castellani Marcelo castellani inalletsaC olecraM Esse é o bloco VAMOS USAR UM BLOCO? vamos usar um bloco? Vamos usar um bloco? ?ocolb mu rasu somaV
Perceba que foi necessário adicionar um par de chaves { } nas chamadas de nosso método, mesmo nas que não passamos o bloco. Caso não o fizessemos teríamos o erro a seguir na execução:
$ ruby 04.rb
4
04.rb:6:in `imprime_tudo': no block given (LocalJumpError)
from 04.rb:23
Para evitar esse problema devemos usar a instrução block_given?, que valida se o bloco foi ou não passado. Nosso método ficará assim:
def imprime_tudo(string_a_imprimir)
# Verifico se é da classe String
if string_a_imprimir.class == String
#executa o bloco antes do método
yield if block_given?
#imprime tudo em maiúsculos
puts string_a_imprimir.upcase
#imprime tudo em minúsculos
puts string_a_imprimir.downcase
#imprime capitalizado
puts string_a_imprimir.capitalize
#imprime de trás pra frente
puts string_a_imprimir.reverse
else
puts string_a_imprimir
end
end
imprime_tudo(4)
imprime_tudo("Marcelo Castellani")
# Uma chamada de método com um bloco
imprime_tudo("Vamos usar um bloco?") { puts "Esse é o bloco" }
Voltar para o tutorial de Ruby, ou ir para o Capítulo 06.
