Как я могу изменить отображаемое значение консоли pry/irb для объекта Ruby?

Вот простой узел графа:

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

Часто я хочу посмотреть на это в консоли pry или irb. Проблема в том, что когда я подключаю график и смотрю на узел, я получаю такой результат:

[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 в консоли, я получаю исходный подробный вывод (как в pry, так и в irb). Раздражает вводить puts каждый раз, когда я хочу посмотреть на свое более компактное представление node в отладчике.

Есть ли какой-то метод, который я могу определить, чтобы переопределить значение отображения консоли объекта? (Я думал, что переопределение inspect сделает это, но это не так.)


person Sasgorilla    schedule 03.03.2017    source источник


Ответы (1)


То, что вы ищете (то, что выводится в pry/irb), является результатом Object#inspect, поэтому просто alias_method для Node:

alias_method :inspect, :to_s

если вы уже переопределили Node#to_s или просто:

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

Также убедитесь, что у вас не установлен awesome_print gem.

person Aleksei Matiushkin    schedule 03.03.2017
comment
Определение inspect не влияет на то, что выводится в консоли (если только я не использую puts node, чего я пытаюсь избежать). У меня установлен awesome_print, но он не загружен в рассматриваемом скрипте, поэтому я был бы удивлен, если бы это вызывало проблему. - person Sasgorilla; 05.03.2017
comment
awesome_print загружается pry, и он исправляет inspect все объекты. - person Aleksei Matiushkin; 05.03.2017
comment
Интересный. irb делает то же самое? Я получаю те же результаты там. Я действительно не хочу удалять awesome_print — есть предложения, как с этим справиться? - person Sasgorilla; 15.03.2017
comment
да. Используйте puts node, если хотите использовать awesome_print, или удалите awesome_print, если хотите использовать только node. Серебряной пули не существует. - person Aleksei Matiushkin; 15.03.2017