Come faccio a Introspect cose in Ruby?
-
21-09-2019 - |
Domanda
Per esempio, in Python, posso fare cose come questa, se voglio ottenere tutti gli attributi di un oggetto:
>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__package__', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'pydebug', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
O se voglio visualizzare la documentazione di qualcosa, posso usare la funzione di help:
>>> help(str)
Esiste un modo per fare cose simili a Ruby?
Soluzione
Certo, è ancora più semplice che in Python. A seconda di quali informazioni che stai cercando, prova:
obj.methods
e se si desidera solo i metodi definiti per obj (invece di ottenere metodi su Object
pure)
obj.methods - Object.methods
Interessante anche fare cose del genere:
obj.methods.grep /to_/
Per ottenere le variabili di istanza, fare questo:
obj.instance_variables
e per le variabili di classe:
obj.class_variables
Altri suggerimenti
Se si desidera che tutti i metodi che è possibile chiamare su qualcosa che l'uso
>>> x.methods
Se volete qualche informazione aiuto quindi chiamare aiuto prima della sua categoria
>>> help x.class
Guida è un wrapper per ri all'interno IRB.
Se si dispone di un oggetto, e volete sapere quali sono i metodi che risponde a, è possibile eseguire obj.methods
(e tutti i trucchi che thenduks ha menzionato su questo risultato.)
Se si dispone di una classe, è possibile eseguire klass.methods
per vedere quali metodi di classe sono availabe, oppure è possibile eseguire klass.instance_methods
sapere quali sono disponibili su istanze di quella classe metodi. klass.instance_methods(false)
è utile, becuase ti dice quali metodi sono stati definiti dalla classe e non ereditata.
C'è ora c'è modo per ottenere testo di aiuto per un metodo all'interno di Ruby il modo in cui lo fa pitone.
C'è un modulo chiamato ObjectSpace
che è incluso in ogni oggetto creato in rubino. Essa detiene tutti i metodi che consentono di introspezione contesto attuale del processo. In IRB si inizia in un contesto che è Object:Main
contesto di primo livello per la corrente sessione di IRB. Allora si potrebbe fare qualcosa di simile time = Time.now
e poi fare irb time
che si tenga contesto di quell'oggetto e si potrebbe esaminare dall'interno senza chiamare i metodi ObjectSpace
su tale oggetto.