【问题标题】:How do I introspect things in Ruby?如何在 Ruby 中自省?
【发布时间】:2011-01-30 08:48:51
【问题描述】:

例如,在 Python 中,如果我想获取对象的所有属性,我可以这样做:

>>> 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 中做类似的事情?

【问题讨论】:

标签: ruby introspection irb


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当然,它甚至比 Python 更简单。根据您要查找的信息,尝试:

    obj.methods
    

    如果您只想要为 obj 定义的方法(而不是在 Object 上获取方法)

    obj.methods - Object.methods
    

    同样有趣的是做类似的事情:

    obj.methods.grep /to_/
    

    要获取实例变量,请执行以下操作:

    obj.instance_variables
    

    对于类变量:

    obj.class_variables
    

    【讨论】:

    • 就文档而言,这通常是通过 rdoc 或 shell 中的类似方法完成的,而不是在解释器中。
    • 但是如果我寻找的不仅仅是方法呢?如果我想要实例或类变量怎么办?
    • 还有@thenduks - 有时我已经在 irb 并且想要一些信息。退出它,阅读rdoc,然后回到irb,有点痛苦。
    • 您可能不需要实例变量或类变量(除非在非常特殊的情况下),因为它们不是类的公共 API 的一部分。在 ruby​​ 中,一切都是通过方法来完成的。
    • @Jason RE: rdoc...我个人从不使用 rdoc(我发现网络是更好的文档来源,我什至在我的 gemrc 中有 --no-rdoc--no-ri) ,我认为对于大多数“红宝石学家”来说都是如此。如果您真的想要 rdoc,那么我建议您在另一个终端中使用它(无论如何您可能需要它用于其他目的:))。正如布兰登在另一个答案中所说,irb 中有一个 ri 助手:help Number... 但它对我不起作用...这只是证明了我的观点,即它不是文档的主要方法红宝石学家:)
    【解决方案3】:

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

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

    现在可以像 python 一样在 Ruby 中获取方法的帮助文本。

    【讨论】:

      【解决方案4】:

      如果你想要所有可以调用的方法而不是使用

      >>> x.methods
      

      如果您需要一些帮助信息,请在其类之前调用​​帮助

      >>> help x.class
      

      Help 是 irb 中 ri 的包装器。

      【讨论】:

        猜你喜欢
        • 2023-04-06
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 2012-12-11
        • 1970-01-01
        相关资源
        最近更新 更多