Ruby · Avançado · Inglês · Técnico
define method
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? # => trueExemplos
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.