Ruby: define_method vs. def
Como um exercício de programação, eu escrevi um trecho de Ruby que cria uma classe, instancia dois objetos dessa classe, monkeypatches um objeto e depende de method_missing para monkeypatch o outro.
Aqui está o acordo. Isso funciona como pretendido:
class Monkey
def chatter
puts "I am a chattering monkey!"
end
def method_missing(m)
puts "No #{m}, so I'll make one..."
def screech
puts "This is the new screech."
end
end
end
m1 = Monkey.new
m2 = Monkey.new
m1.chatter
m2.chatter
def m1.screech
puts "Aaaaaargh!"
end
m1.screech
m2.screech
m2.screech
m1.screech
m2.screech
Você notará que eu tenho um parâmetro para method_missing. Fiz isso porque esperava usar o define_method para criar dinamicamente os métodos ausentes com o nome apropriado. No entanto, isso não funciona. De fato, mesmo usando define_method com um nome estático da seguinte forma:
def method_missing(m)
puts "No #{m}, so I'll make one..."
define_method(:screech) do
puts "This is the new screech."
end
end
Termina com o seguinte resultado:
ArgumentError: wrong number of arguments (2 for 1)
method method_missing in untitled document at line 9
method method_missing in untitled document at line 9
at top level in untitled document at line 26
Program exited.
O que torna a mensagem de erro mais desconcertante é que eu só tenho um argumento paramethod_missing
...