Ruby: define_method vs. def

Als Programmierübung habe ich ein Ruby-Snippet geschrieben, das eine Klasse erstellt, zwei Objekte aus dieser Klasse instanziiert, ein Objekt monkeypatcht und sich darauf verlässt, dass method_missing das andere monkeypatcht.

Das ist der Deal. Das funktioniert wie vorgesehen:

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

Sie werden feststellen, dass ich einen Parameter für method_missing habe. Ich habe dies getan, weil ich gehofft hatte, mithilfe von define_method fehlende Methoden mit dem entsprechenden Namen dynamisch zu erstellen. Es funktioniert jedoch nicht. Selbst wenn define_method mit einem statischen Namen wie folgt verwendet wird:

def method_missing(m)
  puts "No #{m}, so I'll make one..."
  define_method(:screech) do
    puts "This is the new screech."
  end
end

Endet mit folgendem Ergebnis:

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.

Was die Fehlermeldung verwirrender macht, ist, dass ich nur ein Argument dafür habemethod_missing...

Antworten auf die Frage(3)

Ihre Antwort auf die Frage