Ruby 相当于 Python 的 `repr()`?

Ruby equivalent of Python's `repr()`?

是否有 Ruby 等同于 Python 的 repr 方法?我想获得任何给定 ruby 对象的字符串表示形式,其中列出了所有属性、它们的值和所有方法。

我定义了以下方法,但我想知道是否有更规范的方法...

def repr
  attrhash = {}
  instance_variables.sort.each {
    |v|
    attrhash[v] = instance_variable_get(v)
  }
  [ self, self.class.instance_methods.sort, attrhash ].to_s
end

理想情况下,我不想将此方法包含到我想要其 repr 类数据的每个 class 中,我想知道是否有为任何给定对象获取此信息的标准 ruby 机制。

inspect 最接近 Ruby 中的 repr,但它不显示 public 方法。

如果您正在寻找工具:pry https://github.com/pry/pry

ls 命令完全符合您的要求。 您还可以将 pry 集成到您的 irb / rails 控制台中。

或者,您可以使用您的方法进行猴子补丁 class Object,但我觉得这种选择太极端了,有很多缺点。

Ruby 中没有 Python 的 __repr__。乍一看,最接近的东西可能 看起来 #inspect,因为这些相似之处:

This is typically used for debugging, […]

Returns a string containing a human-readable representation of obj.

但是,有一个重要的区别:

If at all possible, this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment).

For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval()

Ruby的#inspect专注于人类可读,而Python的__repr__试图成为“eval()-round-trippable”(即eval(repr(e)) == e),换句话说,它应该是机器可读的

根据 jeremy04Jörg W Mittag 的有用评论,我意识到 Ruby 中没有任何内容对应于 repr,我不能在所有 class 实例中使用简单的 repr 类方法,而无需猴子修补 class Object 本身。但是,我意识到,如果我只是让 repr 成为一个独立的函数,我就可以在没有猴子补丁的情况下获得相同的功能,只要我想要这个信息给定的对象。以下独立功能有效...

def repr(obj)
  attrhash = {}
  obj.instance_variables.sort.each {
    |v|
    attrhash[v] = instance_variable_get(v)
  }
  {
    :string     => obj.inspect,
    :methods    => obj.class.instance_methods.sort,
    :attributes => attrhash
  }
end

我有这个函数 return 一个散列而不是一个字符串,这样我就可以做这样的事情:

repr(obj)[:attributes].

如果我想要一个字符串,我总是可以repr(obj).to_s

另外,我可以把它变成 class。我将把它留作 reader 的练习。 :)