2010-03-22 8 views
21

Por ejemplo, en Python, que puedo hacer cosas como esto si quiero conseguir todos los atributos de un objeto:¿Cómo introspectro las cosas en 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 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?

+1

Nota realmente una respuesta, pero para información básica puede ver: http://ruby-doc.org/core/ –

+0

Consulte esta lista http://www.khelll.com/blog/ruby/ruby-introspection/ – khelll

Respuesta

38

Claro, es incluso 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 contraposición a los métodos que consiguen en Object así)

obj.methods - Object.methods 

También es interesante haciendo cosas como:

obj.methods.grep /to_/ 

Para obtener las variables de instancia, haga lo siguiente:

obj.instance_variables 

y para las variables de clase:

obj.class_variables 
+2

En cuanto a la documentación, esto se hace normalmente a través de rdoc o similar en el intérprete de comandos, y no en el intérprete. – rfunduk

+0

¿Pero qué sucede si estoy buscando algo más que solo métodos? ¿Qué pasa si quiero variables de instancia o de clase? –

+0

También @thenduks - a veces ya estoy en Irb y quiero información sobre algo. Es un poco doloroso salir de él, leer el rdoc y luego volver al IRB. –

4

Si desea que todos los métodos que se pueden llamar en algo que el uso

>>> x.methods 

Si quieres algo de información de ayuda a continuación, llamar ayuda antes de su clase

>>> help x.class 

La ayuda es una envoltura para ri dentro de irb.

1

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 están disponibles, o puede ejecutar klass.instance_methods para saber qué métodos están disponibles en instancias de esa clase. klass.instance_methods(false) es útil, porque te dice qué métodos fueron definidos por la clase y no heredados.

Ahora hay forma de obtener texto de ayuda para un método dentro de Ruby como lo hace python.

1

Hay un módulo llamado ObjectSpace que se incluye en cada objeto creado en ruby. Contiene todos los métodos que lo ayudan a introspectar el contexto actual del proceso. En irb, comienza en el contexto Object:Main, que es el contexto de nivel superior para la sesión actual de IRB. Entonces podría hacer algo como time = Time.now y luego hacer irb time que lo llevaría al contexto de ese objeto y podría inspeccionarlo desde adentro sin llamar a los métodos ObjectSpace en ese objeto.

Cuestiones relacionadas