如何更改Ruby对象的pry / irb控制台显示值?

时间:2017-03-03 14:19:33

标签: ruby console irb pry

这是一个简单的图形节点:

Node = Struct.new(:value, :children) do
  def initialize(value, children=[]); super; end
end

我经常想在pryirb控制台中查看此内容。问题是,当我连接图形并查看节点时,我得到如下输出:

[1] pry(main)> node
=> #<struct Node
 value=13,
 children=
  [#<struct Node
    value=23,
    children=
     [#<struct Node:...>,
      #<struct Node
       value=19,
       children=[#<struct Node:...>, #<struct Node value=10, children=[#<struct Node:...>]>]>]>,
   #<struct Node value=28, children=[#<struct Node:...>]>,
   #<struct Node value=2, children=[#<struct Node:...>]>,
   #<struct Node value=14, children=[#<struct Node:...>]>]>

这很快就会失控,难以阅读。我可以在Node上定义更具可读性的to_s

def to_s; "<#{value} #{children.collect(&:value)}>"; end

但我仍然需要致电puts node来查看:

[1] pry(main)> puts node
<13 [23, 28, 2, 14]>
=> nil

只需在控制台中输入node,即可获得原始的详细输出(pryirb)。每次我想在调试器中查看puts的更紧凑的表示时,输入node会很烦人。

我可以定义一些方法来覆盖对象的控制台显示值吗? (我认为重写inspect会做到这一点,但事实并非如此。)

1 个答案:

答案 0 :(得分:0)

您要查找的内容(pry / irb中输出的内容)是Object#inspect的结果,Node只是alias_method

alias_method :inspect, :to_s

如果您已经重新定义Node#to_s,或只是:

def inspect
  "<#{value} #{children.collect(&:value)}>"
end

另外,请确保您没有安装awesome_print gem。