2017-03-03 120 views
1

這裏有一個簡單的圖形節點:如何更改Ruby對象的pry/irb控制檯顯示值?

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:...>]>]> 

這很快失控,難以閱讀。我可以定義一個更可讀的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)。每次我想在調試器中查看node的更緊湊表示時,都很煩人,因爲要輸入puts

是否有一些方法可以定義來覆蓋對象的控制檯顯示值? (我想重寫inspect會做到這一點,但事實並非如此。)

回答

0

什麼你正在尋找(什麼是正在撬/ IRB輸出)的Object#inspect的結果,所以乾脆alias_methodNode

alias_method :inspect, :to_s 

如果你已經重新定義Node#to_s,或者只是:

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

此外,還要確保您沒有安裝awesome_print寶石做。

+1

定義'inspect'對控制檯中打印的內容沒有影響(除非我使用'puts node',這正是我試圖避免的)。我確實安裝了'awesome_print',但它沒有加載到有問題的腳本中,所以如果這導致了問題,我會感到驚訝。 – Sasgorilla

+0

'awesome_print'正在被'pry'加載,它對所有對象進行monkeypatches'inspect'。 – mudasobwa

+0

有趣。 'irb'也是這樣做的?我在那裏得到了相同的結果。我真的不想卸載'awesome_print' - 關於如何處理這個問題的任何建議? – Sasgorilla