Ruby等价于Python的`repr()`吗?

时间:2019-10-20 13:32:23

标签: ruby repr

是否有与Python的repr方法等效的Ruby?我想获得任何给定的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类数据的类中都包含此方法,并且我想知道是否有标准的ruby机制来获取此方法给定对象的信息。

3 个答案:

答案 0 :(得分:3)

在Ruby中没有Python的__repr__等价物。乍一看,由于这些相似之处,最接近的事物可能出现#inspect

  

This is typically used for debugging, […]

  

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

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

  

如果可能的话,这应该看起来像一个有效的Python表达式,可以用来重新创建具有相同值(在适当的环境下)的对象。

  

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()可以实现三重跳转”(即{{1} }),换句话说,它应该是机器可读的

答案 1 :(得分:3)

基于jeremy04Jörg W Mittag的有用评论,我意识到Ruby中没有与repr相对应的内容,并且我不能使用简单的{在所有类实例中类似于{1}}的方法,而自身没有猴子补丁repr。但是,我意识到,如果仅使class Object为独立函数,则可以在不进行猴子补丁的情况下获得相同的功能,并且只要需要此信息,就可以使用repr而不是repr(obj)给定的对象。以下独立功能有效...

obj.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

如果我想要一个字符串,我总是可以做repr(obj)[:attributes]

此外,我可以将其设置为类。我将其留给读者练习。 :)

答案 2 :(得分:1)

config(['queue.default' => \App\Helpers\ConfigConstants::DUSK_CONNECTION]); //this does not affect the headless browser but IS probably necessary here so that assertQueued knows to pull from the queue that the headless browser was using. 与Ruby中的inspect最接近,但是它不显示公共方法。

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

pry命令完全可以满足您的需求。 您也可以将撬动功能集成到irb / rails控制台中。

或者,您可以用自己的方法修补ls,但是我觉得那是一个极端的选择,有很多缺点。