¿Cómo puedo Introspect cosas en Ruby?
-
21-09-2019 - |
Pregunta
Por ejemplo, en Python, que puede hacer cosas como esto si quiero conseguir todos los atributos de un objeto:
>>> 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 si quiero ver la documentación de algo, puedo usar la función de ayuda:
>>> help(str)
¿Hay alguna manera de hacer cosas similares en Ruby?
Solución
Claro, es aún más simple que en Python. En función de la información que está buscando, intente:
obj.methods
y si quieres sólo los métodos definidos para obj (en lugar de conseguir métodos en Object
también)
obj.methods - Object.methods
También es interesante es hacer cosas como:
obj.methods.grep /to_/
Para obtener las variables de instancia, haga lo siguiente:
obj.instance_variables
y de las variables de clase:
obj.class_variables
Otros consejos
Si desea que todos los métodos que se pueden llamar en algo de uso
>>> x.methods
Si quieres algo de información de ayuda a continuación, llamar ayuda antes de su clase
>>> help x.class
Ayuda es un contenedor de RI dentro del IRB.
Si usted tiene un objeto, y desea saber qué métodos que responde a, puede ejecutar obj.methods
(y todos los trucos que thenduks ha mencionado en este resultado.)
Si usted tiene una clase, puede ejecutar klass.methods
para ver qué métodos de clase son availabe, o puede ejecutar klass.instance_methods
saber qué métodos están disponibles en instancias de esa clase. klass.instance_methods(false)
es útil, becuase que te dice qué métodos se define por la clase y no se hereda.
Ahora hay manera de conseguir texto de ayuda de un método dentro de Ruby la forma de pitón hace.
Hay un módulo llamado ObjectSpace
que se incluye en cada objeto creado en rubí. Lleva a cabo todos los métodos que le ayudan a la introspección contexto actual del proceso. En IRB comenzar en el contexto Object:Main
contexto que es de primer nivel para la sesión actual IRB. Posteriormente, se podría hacer algo como time = Time.now
y luego hacer irb time
que tendría en el contexto de ese objeto y que puede inspeccionar desde el interior sin llamar a métodos ObjectSpace
en ese objeto.