Wie introspect ich die Dinge in Ruby?
-
21-09-2019 - |
Frage
Zum Beispiel in Python, kann ich Dinge wie dies tut, wenn ich alle Attribute für ein Objekt zu bekommen:
>>> 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']
Oder wenn ich die Dokumentation von etwas sehen möchte, kann ich die Hilfe-Funktion:
>>> help(str)
Gibt es eine Möglichkeit ähnliche Dinge in Ruby zu tun?
Lösung
Sicher, es ist noch einfacher als in Python. Je nachdem, welche Informationen Sie suchen, versuchen Sie:
obj.methods
, und wenn Sie wollen nur die für obj definierten Methoden (im Gegensatz zu Methoden auf Object
immer auch)
obj.methods - Object.methods
Auch interessant macht Sachen wie:
obj.methods.grep /to_/
Instanzvariablen zu erhalten, dies tun:
obj.instance_variables
und für Klassenvariablen:
obj.class_variables
Andere Tipps
Wenn Sie alle Methoden möchten, dass Sie sich auf etwas als die Verwendung anrufen
>>> x.methods
Wenn Sie etwas Hilfe Informationen wollen, dann Hilfe vor seiner Klasse aufrufen
>>> help x.class
Hilfe ist ein Wrapper für ri innerhalb irb.
Wenn Sie ein Objekt haben, und Sie wollen wissen, welche Methoden es reagiert, können Sie obj.methods
laufen (und alle Tricks, dass thenduks auf diesem Ergebnis erwähnt wurde.)
Wenn Sie eine Klasse haben, können Sie klass.methods
laufen, um zu sehen, was Klassenmethoden verfügbaren sind, oder Sie können klass.instance_methods
laufen zu wissen, welche Methoden auf Instanzen dieser Klasse zur Verfügung stehen. klass.instance_methods(false)
ist nützlich, becuase es Ihnen sagt, welche Methoden von der Klasse definiert wurden und nicht vererbt.
Es gibt jetzt Art und Weise Hilfetext für eine Methode in Ruby den Weg Python tut zu erhalten.
Es gibt ein Modul ObjectSpace
genannt, die in jedes Objekt in Ruby erstellt enthalten ist. Es hält alle Methoden, die helfen, Sie aktuellen Kontext des Prozesses introspect. In irb beginnen Sie in Object:Main
Kontext, die Top-Level-Kontext für die aktuelle Sitzung irb ist. Dann könnten Sie so etwas wie time = Time.now
tun und dann irb time
tun, die Sie in dieses Objekts Kontext nehmen würde und man konnte es von innen inspizieren, ohne auf diesem Objekt ObjectSpace
Methoden aufrufen.