Ontem fui assistir o Show Day Rails palestrado pelo grande Fábio Akita (www.akitaonrails.com) que como muitos sabem é um dos maiores nomes de Ruby on Rails no Brasil e no mundo.
O curso em si foi muito interessante, ele demonstrou alguns conceitos de Ruby, sendo que um deles me chamou bastante a atenção foi o fato da linguagem suportar metaprogramação uma vez que é dinâmica.

Bom para quem não sabe metaprogramação basicamente significa “código que gera código”, o primeiro impacto causado a maioria dos programadores que não conheciam este conceito é de se sentir muito impressionado, porém depois vem a pergunta “para que eu vou precisar disso?”

Veja este exemplo:


  #método que recebe um bloco como parâmetro e o executa
  def custom(&block)
    block.call
  end

  #chamando o método
  custom {puts "olá"}

Em tempo de execução na verdade o método incorpora o bloco de código para dentro ficando assim:

  def custom
    puts "olá"
  end

Qualquer bloco de código passado por parâmetro será incorporado a este método.

Uma maneira mais simples e limpa:

  def custom
    yield
  end

  custom {puts "Testing the yield power"}

A metaprogramação tem utilidade sim, utilidade que pode não ser enxergada a primeira momento por alguns programadores pois trata-se de algo um pouco avançado, no entanto ela pode ser usada por exemplo para geração de testes em Rails de uma forma mais inteligente chamada de Rspec que implementa o conceito BDD (Behaviour Driven Development).

Até lá.