Ruby: define_method vs. def

Como ejercicio de programación, he escrito un fragmento de Ruby que crea una clase, crea una instancia de dos objetos de esa clase, monkeypatches un objeto y confía en method_missing para monkeypatch el otro.

Aquí está el trato. Esto funciona según lo previsto:

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

Notarás que tengo un parámetro para method_missing. Hice esto porque esperaba usar define_method para crear dinámicamente los métodos que faltan con el nombre apropiado. Sin embargo, no funciona. De hecho, incluso utilizando define_method con un nombre estático como tal:

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 con el siguiente 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.

Lo que hace que el mensaje de error sea más desconcertante es que solo tengo un argumento paramethod_missing...

Respuestas a la pregunta(3)

Su respuesta a la pregunta