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
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)
.
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)
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.
Intendi 'parent = obj.class.superclass', giusto? – sepp2k
'whatever.methods' restituisce un' Array' nella versione di Ruby in esecuzione. Lo stesso con 'whatever.public_methods'. – cHao
@ sepp2k - sì, grazie - risolto! – sethvargo