2011-01-12 12 views
17

Mi chiedo se esiste una chiamata al metodo Ruby che mostra solo i metodi definiti dall'oggetto Ruby da cui è chiamato, al contrario di tutti i metodi definiti dalle sue classi antenate, che è ciò che sembra fare methods.Come ispezionare i metodi di un oggetto Ruby?

risposta

30

methods accetta un parametro booleano facoltativo, che specifica se elencare anche i metodi dalla classe dell'oggetto e le sue superclassi o solo i metodi di singleton dell'oggetto. Quindi puoi fare obj.methods(false) per ottenere solo i metodi singleton definiti su obj.

Se si desidera che i metodi definiti dalla classe dell'oggetto, ma non quelli definiti dalle sue superclassi, è possibile ottenerlo chiamando lo instance_methods(false) nella classe dell'oggetto, quindi è obj.class.instance_methods(false).

1

Hai alcune opzioni - object.methods, object.public_methods, object.singleton_methods ... dipende da ciò che desideri. Dal momento che entrambi restituiscono un array, si potrebbe desiderare di provare qualcosa di simile:

# obj is the current object 
parent = obj.class.superclass 

methods = (obj.methods - parent.methods) 
+1

Intendi 'parent = obj.class.superclass', giusto? – sepp2k

+1

'whatever.methods' restituisce un' Array' nella versione di Ruby in esecuzione. Lo stesso con 'whatever.public_methods'. – cHao

+0

@ sepp2k - sì, grazie - risolto! – sethvargo

4

io ho un debole per obj.methods.sort ma alcune delle altre risposte sono migliori in alcuni casi, in quanto descrivono

È inoltre possibile utilizzare obj.methods.sort.grep /foo/ per trovare i nomi dei metodi che corrispondono alla regexp. Questo è utile quando hai un'idea di cosa stai cercando.

Problemi correlati