2010-03-22 22 views
21

Per esempio, in Python, posso fare le cose come questo se voglio ottenere tutti gli attributi di un oggetto:Come posso introspettare le cose in Ruby?

>>> 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 aiuto:

>>> help(str) 

C'è un modo per fare cose simili in Ruby?

+1

Nota davvero una risposta, ma per informazioni di base si può vedere: http://ruby-doc.org/core/ –

+0

Controlla questo elenco http://www.khelll.com/blog/ruby/ruby-introspection/ – khelll

risposta

38

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 (in contrapposizione a metodi di salire su Object così)

obj.methods - Object.methods 

Interessante anche roba fare come:

obj.methods.grep /to_/ 

Per ottenere le variabili di istanza, fare questo:

obj.instance_variables 

e per le variabili di classe:

obj.class_variables 
+2

Per quanto riguarda la documentazione, ciò avviene normalmente tramite rdoc o simili nella shell e non nell'interprete. – rfunduk

+0

Ma cosa succede se sto cercando più di semplici metodi? Ti piace cosa voglio se istanze o variabili di classe? –

+0

Anche @thenduks - a volte sono già in irb e voglio informazioni su qualcosa. È un po 'difficile uscirne fuori, leggere l'rdoc e poi tornare in irb. –

4

Se si desidera che tutti i metodi che è possibile chiamare su qualcosa che utilizzare

>>> x.methods 

Se volete qualche informazione aiuto quindi chiamare aiuto prima della sua categoria

>>> help x.class 

L'aiuto è un wrapper per ri all'interno di irb.

1

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 disponibili, oppure è possibile eseguire klass.instance_methods per sapere quali metodi sono disponibili sulle istanze di tale classe. klass.instance_methods(false) è utile, perché indica quali metodi sono stati definiti dalla classe e non ereditati.

C'è ora modo di ottenere testo di aiuto per un metodo all'interno di Ruby come fa python.

1

C'è un modulo chiamato ObjectSpace che è incluso in ogni oggetto creato in ruby. Contiene tutti i metodi che consentono di approfondire il contesto attuale del processo. In irb si inizia nel contesto Object:Main che è il contesto di livello superiore per la sessione irb corrente. Quindi potresti fare qualcosa come time = Time.now e poi fare irb time che ti porterà nel contesto di quell'oggetto e puoi ispezionarlo dall'interno senza chiamare i metodi ObjectSpace su quell'oggetto.

Problemi correlati