Chamando um método por um nome que você ainda não sabe

Prévia grátis 3 min de leitura

O problema que chamadas comuns não resolvem

Toda chamada de método até aqui nesta série teve a forma object.method_name, com method_name digitado no código e fixado quando o arquivo foi escrito. Isso cobre quase tudo, até o método a chamar ser ele mesmo um dado, que só se conhece com o programa rodando.

action = fetch_user_choice  # retorna "walk", "run", ou "jump" -- decidido em tempo de execução

Chamar robot.action aqui está errado: o Ruby procuraria um método chamado action em vez de ler a string guardada na variável. A saída de costume é uma tabela de despacho:

case action
when "walk" then robot.walk
when "run" then robot.run
when "jump" then robot.jump
end

Isso funciona, mas não escala. Cada ação nova exige editar também esse case, um segundo lugar que precisa acompanhar os métodos que robot tem.

Meta: código que trabalha com código

Este curso e o próximo, que fecha esta série, costumam ficar sob o rótulo "metaprogramação". O nome parece maior do que a ideia. Quer dizer escrever código cujo assunto é outro código: métodos, classes e chamadas tratados como dados para inspecionar e mudar, em vez de texto fixo que alguém digita toda vez. .send e define_method são duas das ferramentas mais diretas do Ruby para isso. A mesma família de técnicas permite que attr_accessor e o delegate do Rails gerem métodos que ninguém escreveu um por um. Aulas mais adiante checam isso no código instalado do Rails.

O que este curso cobre

  • .send(:method_name, *args), chamar qualquer método por um nome calculado em tempo de execução, com uma exceção importante e surpreendente ao que "qualquer método" quer dizer, vista na aula 3.
  • define_method, gerar métodos quando a classe é definida, a partir de um símbolo ou string e um bloco, em vez de escrever um def para cada um.
  • Como isso se liga ao código real do Rails: o que attr_accessor e delegate fazem para gerar os métodos que prometem.

Pontos-chave

  • Uma chamada comum object.method_name exige o nome do método como texto fixo no código, conhecido quando o arquivo foi escrito.
  • Quando o método a chamar só é conhecido como dado em tempo de execução, como uma string ou símbolo numa variável, você precisa de outro mecanismo: o assunto deste curso.
  • Metaprogramação é escrever código que trata métodos e classes como dados, inspecionando ou gerando esses métodos, em vez de digitar cada chamada e definição à mão.
  • .send e define_method são duas ferramentas centrais de metaprogramação do Ruby, e este curso checa que os geradores do próprio Rails usam essa família de técnicas.
Aula 1 de 7 · grátis

Continue com a aula 2

.send: chamando métodos por um nome dinâmico

O .send chama um método por um nome em símbolo ou string, repassando argumentos e blocos.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...