0Pricing
Ruby Academy · Aula

Definição dinâmica de métodos

Aprenda a definir e chamar métodos dinamicamente usando define_method e method_missing.

Definição dinâmica de métodos é uma aula grátis de Ruby Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Ruby Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Ruby Academy inclui 4 aulas no total.

Criando métodos dinamicamente

Definição dinâmica de métodos

No Ruby, os métodos podem ser criados dinamicamente em tempo de execução.

Isso permite escrever um código mais flexível e reutilizável.

Definição dinâmica de métodos — ilustração 1

Usando define_method

Usando define_method

O método define_method permite definir métodos dinamicamente.

class Person
  define_method(:greet) { puts 'Hello!' }
end

p = Person.new
p.greet

Usando define_method com parâmetros

Usando define_method com parâmetros

Você pode passar argumentos para métodos criados dinamicamente.

class Person
  define_method(:greet) { |name| puts "Hello, #{name}!" }
end

p = Person.new
p.greet('Alice')

Usando method_missing

Usando method_missing

O método method_missing intercepta chamadas a métodos não definidos.

class Person
  def method_missing(name, *args)
    puts "Method '#{name}' is missing!"
  end
end

p = Person.new
p.unknown_method

Tratando method_missing dinamicamente

Tratando method_missing dinamicamente

Você pode usar method_missing para definir um tratamento flexível de métodos.

class DynamicPerson
  def method_missing(name, *args)
    if name.to_s.start_with?('say_')
      puts "You asked me to say: #{name.to_s.split('_')[1..-1].join(' ')}"
    else
      super
    end
  end
end

p = DynamicPerson.new
p.say_hello_world

Substituindo respond_to_missing?

Substituindo respond_to_missing?

Para tratar verificações de métodos corretamente, substitua respond_to_missing?.

class DynamicPerson
  def method_missing(name, *args)
    if name.to_s.start_with?('say_')
      puts "Saying: #{name.to_s.split('_')[1..-1].join(' ')}"
    else
      super
    end
  end
  
  def respond_to_missing?(name, include_private = false)
    name.to_s.start_with?('say_') || super
  end
end

p = DynamicPerson.new
puts p.respond_to?(:say_hello)

Usando method_missing para métodos dinâmicos de leitura e atribuição

Usando method_missing para métodos dinâmicos de leitura e atribuição

Você pode criar atributos dinâmicos usando method_missing.

class DynamicPerson
  def initialize
    @data = {}
  end
  
  def method_missing(name, *args)
    attribute = name.to_s.sub(/=$/, '')
    if name.to_s.end_with?('=')
      @data[attribute] = args.first
    else
      @data[attribute]
    end
  end
end

p = DynamicPerson.new
p.name = 'Alice'
puts p.name

Riscos de segurança do method_missing

Riscos de segurança do method_missing

Usar method_missing de maneira inadequada pode introduzir riscos:

  • Comportamento inesperado ao lidar com métodos desconhecidos.
  • Possíveis problemas de desempenho devido a buscas excessivas por métodos.
  • Vulnerabilidades de segurança se combinado com a entrada do usuário.

Recapitulação dos métodos dinâmicos

Parabéns!

Você aprendeu a definir e chamar métodos dinamicamente em Ruby.

Em seguida, você explorará classes abertas e alteração dinâmica.

Definição dinâmica de métodos — ilustração 10

Perguntas Frequentes

A aula “Definição dinâmica de métodos” é grátis?

Sim — o texto completo de “Definição dinâmica de métodos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Ruby Academy, atualize para CoddyKit PRO. O curso de Ruby Academy inclui 4 aulas no total.

O que vou aprender em “Definição dinâmica de métodos”?

Aprenda a definir e chamar métodos dinamicamente usando define_method e method_missing. Você pratica Ruby Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Ruby Academy?

Nenhuma experiência prévia é necessária. Ruby Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Definição dinâmica de métodos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Ruby Academy?

Sim. Cada aula de Ruby Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O que é metaprogramação?
  2. Definição dinâmica de métodos
  3. Classes abertas e monkey patching
  4. Uso de send e eval
← Voltar para Ruby Academy