Meta Ruby: method_missing
O curso trata do method_missing, o gancho que o Ruby chama quando a busca comum de métodos pela cadeia de ancestors volta vazia. Ele mostra que a versão padrão, em BasicObject, levanta NoMethodError, e que qualquer classe pode sobrescrevê-la para tratar famílias de chamadas sem um def para cada uma. Também explica por que uma sobrescrita sem super engole erros de digitação, como o super traz o erro de volta e por que o respond_to_missing? precisa vir junto. No fim, lê o código do delegate_missing_to do Rails e monta um proxy com as mesmas peças.
O que você vai aprender
- ✓Como o Ruby chama o method_missing antes de levantar NoMethodError
- ✓Sobrescrever o method_missing para tratar uma família de chamadas parecidas
- ✓Chamar super para as chamadas que o method_missing não trata
- ✓Sobrescrever o respond_to_missing? para que respond_to? e method() respondam certo
- ✓Como o delegate_missing_to do Rails usa o par method_missing e respond_to_missing?
- ✓Montar um proxy que repassa chamadas com method_missing, respond_to_missing? e super
O que acontece quando um método não existe
NoMethodError apareceu muitas vezes nesta série: um erro de digitação, um método chamado no tipo errado, um nome que não existe naquele objeto.
Ler a aula completa grátis →Currículo
7 aulasO que acontece quando um método não existe
Depois de uma busca sem resultado, o Ruby chama method_missing, e a versão padrão de BasicObject levanta NoMethodError.
Sobrescrevendo method_missing
A assinatura do method_missing e uma sobrescrita que responde a uma família de chamadas, como x, y e z.
O perigo de esquecer o super
Um method_missing sem saída para o resto absorve todo nome, e erros de digitação devolvem valores em vez de erro.
Chamando super para o que você não trata
Um if/else com super no ramo else faz as chamadas não tratadas voltarem a levantar NoMethodError.
respond_to_missing?: o método companheiro
Sobrescrever respond_to_missing? com a mesma condição faz respond_to? e method() concordarem com o method_missing.
delegate_missing_to no código do Rails
Leitura do código do delegate_missing_to do Rails e do exemplo escrito à mão do par nos comentários.
Juntando tudo: fechando a série
Um build_proxy junta method_missing que repassa, respond_to_missing? com a mesma condição e super, na forma do delegate_missing_to.