2017-03-03 4 views
1

Hier ist ein einfacher Graph Knoten:Wie kann ich den Anzeigewert der PRY/IRB-Konsole für ein Ruby-Objekt ändern?

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

Häufig ich dies in einer pry oder irb Konsole zu suchen. Das Problem ist, wenn ich die Grafik verdrahten und schauen an einem Knoten, ich Ausgabe wie folgt erhalten:

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

usw.

Dies wird schnell aus der Hand und schwer zu lesen. Ich kann einen lesbare to_s auf Knoten definieren:

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

Aber ich brauche noch puts node zu nennen, dies zu sehen:

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

Gerade node in der Konsole eingeben, gibt mir die ursprüngliche ausführliche Ausgabe (in beide pry und irb). Es ist ärgerlich, puts jedes Mal einzugeben, wenn ich meine kompaktere Darstellung von node im Debugger betrachten möchte.

Gibt es eine Methode, die ich definieren kann, um den Konsolenanzeigewert eines Objekts zu überschreiben? (Ich dachte, inspect zwingende würde dies tun, aber es funktioniert nicht.)

Antwort

0

Was Sie suchen (was Ausgabe in hebeln sein/rb) ist das Ergebnis der Object#inspect, so einfach alias_method für Node:

alias_method :inspect, :to_s 

wenn Sie neu definiert bereits Node#to_s, oder einfach nur:

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

stellen Sie außerdem sicher, dass Sie nicht awesome_print gem installiert haben.

+1

Das Definieren von 'inspect' hat keine Auswirkungen auf das, was in der Konsole gedruckt wird (außer ich benutze' puts node', was ich zu vermeiden versuche). Ich habe 'awesome_print' installiert, aber es ist nicht in das fragliche Skript geladen, also wäre ich überrascht, wenn das das Problem verursacht. – Sasgorilla

+0

'awesome_print' wird von' pry' geladen und es monkeypatches 'inspect' an allen Objekten. – mudasobwa

+0

Interessant. 'irb' macht dasselbe? Ich bekomme dort die gleichen Ergebnisse. Ich möchte '' awesome_print' 'nicht wirklich deinstallieren - irgendwelche Vorschläge, wie man damit umgeht? – Sasgorilla

Verwandte Themen