2010-03-22 3 views
21

Par exemple, en Python, je peux faire des choses comme ça si je veux obtenir tous les attributs d'un objet:Comment introspecter des choses dans 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'] 

Ou si je veux voir la documentation de quelque chose, je peux utiliser la fonction d'aide:

>>> help(str) 

Existe-t-il un moyen de faire des choses similaires dans Ruby?

+1

Notez vraiment une réponse, mais pour l'information de base, vous pouvez voir: http://ruby-doc.org/core/ –

+0

Consultez cette liste http://www.khelll.com/blog/ruby/ruby-introspection/ – khelll

Répondre

38

Bien sûr, c'est encore plus simple qu'en Python. Selon les informations que vous cherchez, essayez:

obj.methods 

et si vous voulez seulement les méthodes définies pour obj (par opposition à la méthodes sur Object ainsi)

obj.methods - Object.methods 

est également intéressante faire des trucs comme:

obj.methods.grep /to_/ 

Pour obtenir les variables d'instance, procédez comme suit:

obj.instance_variables 

et pour les variables de classe:

obj.class_variables 
+2

En ce qui concerne la documentation, cela se fait normalement via rdoc ou similaire dans le shell, et non dans l'interpréteur. – rfunduk

+0

Mais que faire si je cherche plus que de simples méthodes? Comme si je veux des variables d'instance ou de classe? –

+0

Aussi @thenduks - parfois je suis déjà en IRB et je veux des infos sur quelque chose. C'est un peu pénible d'en sortir, de lire le rdoc, puis de retourner dans IRB. –

4

Si vous voulez que toutes les méthodes que vous pouvez faire appel à quelque chose que d'utiliser

>>> x.methods 

Si vous voulez des informations d'aide ensuite appeler l'aide avant sa catégorie

>>> help x.class 

L'aide est un wrapper pour ri dans irb.

1

Si vous avez un objet, et vous voulez savoir quelles méthodes il répond, vous pouvez exécuter obj.methods (et toutes les astuces qui thenduks a mentionnées sur ce résultat.)

Si vous avez une classe, vous pouvez exécuter klass.methods pour voir quelles méthodes de classe sont disponibles, ou vous pouvez exécuter klass.instance_methods pour savoir quelles méthodes sont disponibles sur les instances de cette classe. klass.instance_methods(false) est utile, car elle vous indique quelles méthodes ont été définies par la classe et non héritées.

Il est maintenant possible d'obtenir du texte d'aide pour une méthode dans Ruby, comme le fait python.

1

Il existe un module appelé ObjectSpace qui est inclus dans chaque objet créé dans ruby. Il contient toutes les méthodes qui vous aident à introspecter le contexte actuel du processus. Dans irb vous commencez dans le contexte Object:Main qui est le niveau le plus élevé du contexte de la session actuelle. Ensuite, vous pouvez faire quelque chose comme time = Time.now et ensuite faire irb time qui vous emmènerait dans le contexte de cet objet et vous pourriez l'inspecter de l'intérieur sans appeler les méthodes ObjectSpace sur cet objet.

Questions connexes