Der von Ihnen gepostete Code funktioniert gut, um zu überprüfen, ob die Methode definiert ist oder nicht. Module#method_defined?
ist genau die richtige Wahl. (Es gibt auch die Varianten Module#public_method_defined?
, Module#protected_method_defined?
und Module#private_method_defined?
.) Das Problem ist mit Ihrem Aufruf von def_method
, der nicht existiert. (Es heißt Module#define_method
).
Das funktioniert wie ein Zauber:
%Vor% Da Sie jedoch den Namen bereits im Voraus kennen und keine Schließung verwenden, müssen Sie nicht Module#define_method
verwenden, sondern stattdessen das Schlüsselwort def
:
Oder habe ich Ihre Frage missverstanden und Sie machen sich Sorgen um die Erbschaft? In diesem Fall ist Module#method_defined?
nicht die richtige Wahl, da es die gesamte Vererbungskette durchläuft. In diesem Fall müssen Sie Module#instance_methods
oder einen seiner Cousins Module#public_instance_methods
, Module#protected_instance_methods
oder Module#private_instance_methods
, die ein optionales Argument verwenden, um anzugeben, ob Methoden aus Superklassen / Mixins eingeschlossen werden sollen oder nicht. (Beachten Sie, dass die Dokumentation falsch ist: Wenn Sie keine Argumente übergeben, enthält alle übernommenen Methoden.)
Hier ist eine kleine Testsuite, die zeigt, dass mein Vorschlag funktioniert:
%Vor% Sehen Sie sich die Ruby Object-Klasse an. Es hat eine Funktion methods
, um eine Liste von Methoden zu erhalten, und eine respond_to?
, um nach einer bestimmten Methode zu suchen. Sie möchten also Code wie folgt:
Tags und Links ruby ruby-on-rails methods defined