Wie kann man beurteilen, ob eine Methode in einer Klasse definiert wurde?

8
%Vor%

Also, wie beurteilt man, ob eine Methode definiert wurde oder nicht?

    
Croplio 04.08.2010, 06:05
quelle

3 Antworten

17

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 :

%Vor%

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.)

%Vor%

Hier ist eine kleine Testsuite, die zeigt, dass mein Vorschlag funktioniert:

%Vor%     
Jörg W Mittag 04.08.2010, 07:23
quelle
2

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:

%Vor%     
Gerhard 04.08.2010 06:16
quelle
1

Die Object-Klasse hat die Methode "methods": Dokumente

%Vor%     
demas 04.08.2010 06:12
quelle