Метод, который используется для обеспечения удобочитаемого представления объекта, равен #inspect
. Это также метод, используемый большинством REPL для отображения объектов, хотя некоторые REPL используют другие * REP37-специфичные c методы, такие как #pretty_inspect
.
. Очень важно, чтобы все эти методы предназначены только для потребления человеком . Вы не должны анализировать их выходные данные, вы не должны использовать их для сериализации, обработки или чего-либо другого, кроме , просматривая их только в целях отладки .
Итак, зная, что рассматриваемый метод - Hash#inspect
, вы можете попробовать переопределить метод. Просто помните, что изменение поведения основных методов никогда не должно выполняться в производственном коде . Это пример для только для этого ответа :
module HashPrettyPrintExtension
def inspect
'{ ' <<
map do |k, v|
k = k.to_s if k.is_a?(Symbol)
%Q[#{k.inspect}: #{v.inspect}]
end.join(', ') <<
' }'
end
end
module HashPrettyPrintRefinement
refine Hash do
prepend HashPrettyPrintExtension
end
end
{ "description": "Hello", "id": "H" }
#=> { :description => "Hello", :id => "H" }
using HashPrettyPrintRefinement
{ "description": "Hello", "id": "H" }
#=> { "description": "Hello", "id": "H" }
Обратите внимание, что предлагаемый вывод несколько ограничен. Это действительно хорошо работает только для ключей, которые Symbol
с и значения, которые String
с, тогда как в Ruby ключи могут быть любой произвольный объект , а значения могут быть любой произвольный объект .
Кроме того, ваш предложенный вывод в точности противоречит цели #inspect
, а именно - обеспечить читабельный вывод отладочной информации, потому что не легко увидеть, что ключ не является строкой.