2010-03-22 37 views
21

例如,在Python,我可以做这样的事情,如果我想获得一个对象的所有属性:我如何在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'] 

或者,如果我想要查看的一些文件,我可以使用帮助功能:

>>> help(str) 

有没有办法在Ruby中做类似的事情?

+1

注意一个答案,但对于您可能会看到的核心信息:http://ruby-doc.org/core/ – 2010-03-22 14:17:46

+0

检查此列表http://www.khelll.com/blog/ruby/ruby-introspection/ – khelll 2010-03-31 14:59:48

回答

38

当然,它比Python更简单。根据您正在寻找什么样的信息,请尝试:

obj.methods 

,如果你想只为OBJ定义(而不是获取方法上Object以及)方法

obj.methods - Object.methods 

而且有趣的是,做的东西,如:

obj.methods.grep /to_/ 

获得实例变量,这样做:

obj.instance_variables 

和类变量:

obj.class_variables 
+2

就文档而言,这通常是通过rdoc或shell中的类似工具完成的,而不是在解释器中。 – rfunduk 2010-03-22 14:06:00

+0

但是如果我正在寻找的不仅仅是方法呢?就像我想要实例或类变量一样? – 2010-03-22 14:25:47

+0

也@thenduks - 有时我已经在irb和想要的东西信息。退出它有点痛苦,阅读rdoc,然后回到irb。 – 2010-03-22 14:29:19

4

如果你希望所有的,你可以在一些调用的方法比使用

>>> x.methods 

如果你想那么一些帮助信息,其

课前打电话求助
>>> help x.class 

帮助是irb中ri的包装。

1

如果你有一个对象,你想知道什么方法它回应,你可以运行obj.methods(和所有thenduks已经对这个结果中提到的技巧。)的

如果你有一个类,您可以运行klass.methods以查看可用的类方法,也可以运行klass.instance_methods以了解该类的实例上有哪些方法可用。 klass.instance_methods(false)是有用的,因为它告诉你什么方法是由类定义,而不是继承。

现在有方法可以用python的方式在Ruby中获取帮助文本。

1

有一个叫做ObjectSpace的模块,它包含在每个用ruby创建的对象中。它包含所有帮助您反思当前流程背景的方法。在irb中,您从Object:Main上下文开始,该上下文是当前irb会话的顶级上下文。然后,您可以执行诸如time = Time.now之类的操作,然后执行irb time这会将您带入该对象的上下文,并且您可以从内部检查它,而无需在该对象上调用ObjectSpace方法。