#3 Metaprogramação: method_missing()

Posted on February 10, 2010

2


No último post vimos como aplicar metaprogramação para melhorar
a classe Computador, utilizando Dynamic Methods e Dynamic Dispatch.

Porém essa não é a única forma. Você já conhece o modelo de objetos Ruby e a técnica “one step right, then up“, que consiste em primeiro procurar um método na classe do objeto receiver e depois subir em suas superclasses.

Quando o Ruby não encontra o método invocado nesse caminho, é disparado NoMethodError:

Quando o método format é chamado, Ruby verifica a classe Computador e procura pelos métodos de instância. Se ele não encontrar lá, ele começa a procurar nas superclasses até chegar em Object e Object inclui um método chamado method_missig().

Ghost Methods: Sobrescrevendo o method_missing()

Toda mensagem direcionada ao method_missing inclui o nome
do método chamado mais todos os argumentos ou blocos associados.

Obs: method_missing é muito usado em Ruby, bons exemplos
podem ser encontrados no Ruport, OpenStruct e no próprio Rails.

Refatorando

Vamos utilizar o method_missig para refatorar nossa classe Computador.

O que acontece quando um método como cpu é chamado ? A chamada chega no method_missig, que verifica se a classe possui um método chamado get_cpu_info(). Caso não exista, a chamada cai no method_missing do Kernel, que foi sobrescrito! Agora com apenas um método nossa classe resolve todos os casos que precisamos!

Continua
Próximo post – Blocos