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
,因为这些相似之处:
和
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).
和
Ruby的#inspect
专注于人类可读,而Python的__repr__
试图成为“eval()
-round-trippable”(即eval(repr(e)) == e
),换句话说,它应该是机器可读的。
根据 jeremy04
和 Jö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 的练习。 :)
是否有 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
,因为这些相似之处:
和
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).
和
Ruby的#inspect
专注于人类可读,而Python的__repr__
试图成为“eval()
-round-trippable”(即eval(repr(e)) == e
),换句话说,它应该是机器可读的。
根据 jeremy04
和 Jö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 的练习。 :)