ExpertiDict

Ruby · Avançado · Inglês · Técnico

define method

/dɪˈfaɪn ˈmɛθəd/método

Método que cria um método de instância em execução, a partir de um nome e de um bloco. Como o bloco é uma closure, o método enxerga variáveis do contexto.

Onde usar

Evita repetição quando vários métodos seguem o mesmo molde, como um status? para cada estado. No code review, compare com method_missing: define_method cria o método de verdade, é mais rápido e fácil de depurar.

Em código

class Pedido
  STATUS = %w[novo pago enviado]
  STATUS.each do |s|
    define_method("#{s}?") { @status == s }
  end
  def initialize(s); @status = s; end
end
puts Pedido.new('pago').pago?  # => true

Exemplos

We use define_method to generate one predicate per status.

Usamos define_method para gerar um predicado para cada status.

define_method beats method_missing because the method really exists.

define_method é melhor que method_missing porque o método realmente existe.

Cuidado

Cuidado com nomes vindos de entrada externa: um nome inesperado pode sobrescrever um método importante.

Veja também

Todos os termos de Ruby