Comment puis-je Introspect les choses en Ruby?
-
21-09-2019 - |
Question
Par exemple, en Python, je peux faire des choses comme ça si je veux obtenir tous les attributs d'un objet:
>>> 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)
Est-il possible de faire des choses semblables à Ruby?
La solution
Bien sûr, il est encore plus simple que dans 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
Il est également intéressant de faire des choses comme:
obj.methods.grep /to_/
Pour les variables d'instance, faites ceci:
obj.instance_variables
et pour les variables de classe:
obj.class_variables
Autres conseils
Si vous voulez que toutes les méthodes que vous pouvez faire appel à quelque chose que l'utilisation
>>> x.methods
Si vous voulez des informations d'aide appelez alors l'aide avant sa classe
>>> help x.class
L'aide est un wrapper pour ri dans les RIR.
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é ce résultat.)
Si vous avez une classe, vous pouvez exécuter klass.methods
pour voir quelles méthodes de classe sont availabe, ou vous pouvez exécuter klass.instance_methods
savoir quelles méthodes sont disponibles sur les instances de cette classe. klass.instance_methods(false)
est utile, car du coup il vous dit quelles étaient les méthodes définies par la classe et non héréditaire.
Il y a maintenant moyen d'obtenir un texte d'aide pour une méthode dans Ruby le python ainsi fait.
Il y a un module appelé ObjectSpace
qui est inclus dans chaque objet créé en rubis. Il contient toutes les méthodes qui vous aident à introspecter contexte actuel du processus. Dans irb vous commencez dans un contexte de Object:Main
qui est le contexte de haut niveau pour la session en cours RIR. Ensuite, vous pouvez faire quelque chose comme time = Time.now
et ne irb time
qui vous emmènera dans le contexte de cet objet et vous pouvez l'inspecter de l'intérieur sans faire appel à des méthodes de ObjectSpace
sur cet objet.