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.

Ferramentas pessoais