sexta-feira, 28 de setembro de 2007

Ruby e o method_missing

Os objetos em Ruby possuem um método chamado 'respond_to?' para verificar se o objeto possui (ou melhor, se ele responde a) um determinado método. Em uma linguagem dinâmica como o ruby, onde podemos incluir um método numa classe em runtime, é um recurso muito necessário, ainda mais se pensarmos em termos de Duck Typing.

Em caso de dúvida, basta fazer um if, afinal chamar um método que não existe causa um NoMethodError, certo?

Depende. Observe:

class A
def xxx()
puts "xxx"
end
def method_missing(m, *args)
puts "nao tenho esse metodo: #{m}"
end
end

a = A.new
a.xxx
# aqui normalmente daria erro e o script seria abortado
# sem o rescue adequado
a.yyy


Resultado:
~> ruby A.rb
xxx
nao tenho esse metodo: yyy


Eu sobreescrevi o método 'method_missing', que como o próprio nome indica, intercepta uma chamada a um método inexistente. Divertido, não?

Nenhum comentário: