Лучший способ довольно печатать хэш
У меня большой хэш с вложенными массивами и хешами. Я хотел бы просто распечатать его, чтобы он был "читабельным" для пользователя.
Я бы хотел, чтобы это было похоже на to_yaml - это довольно читаемое, но все же слишком технологичное.
В конечном итоге это будут конечные пользователи, которым необходимо прочитать эти куски данных, чтобы их нужно было отформатировать в чистоте.
Любые предложения?
Ответы
Ответ 1
require 'pp'
pp my_hash
Используйте pp
, если вам нужно встроенное решение и просто хотите разумные разрывы строк.
Используйте awesome_print, если вы можете установить драгоценный камень. (В зависимости от ваших пользователей вы можете использовать параметр index:false
, чтобы отключить отображение индексов массива.)
Ответ 2
Если у вас есть JSON, я рекомендую JSON.pretty_generate(hash)
, потому что он проще, чем awesome_print, отлично выглядит в теге pre
и позволяет легко копировать с веб-страницы. (См. также: Как я могу "красиво" отформатировать вывод JSON в Ruby on Rails?)
Ответ 3
Другое решение, которое работает лучше для меня, чем pp
или awesome_print
:
require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
Ответ 4
Если у вас нет каких-либо причудливых действий gem, но есть JSON, эта строка CLI будет работать на хеш:
puts JSON.pretty_generate(my_hash).gsub(":", " =>")
#=>
{
:key1 => "value1",
:key2 => "value2",
:key3 => "value3"
}
Ответ 5
Используйте приведенные выше ответы, если вы печатаете пользователям.
Если вы хотите только распечатать его для себя в консоли, я предлагаю использовать pry gem вместо irb. Помимо красивой печати, у pry также много других функций (проверьте railscast ниже)
gem install pry
И проверьте этот railscast:
http://railscasts.com/episodes/280-pry-with-rails
Ответ 6
Используя Pry, вам просто нужно добавить следующий код к вашему ~/.pryrc:
require "awesome_print"
AwesomePrint.pry!
Ответ 7
Из всех драгоценных камней, которые я пробовал, show_data
gem работал лучше для меня, теперь я широко использую его для регистрации хэша params в Rails почти все время
Ответ 8
Это легко сделать с помощью json, если вы доверяете своим ключам в здравом уме:
JSON.pretty_generate(a: 1, 2 => 3, 3 => nil).
gsub(": null", ": nil").
gsub(/(^\s*)"([a-zA-Z][a-zA-Z\d_]*)":/, "\\1\\2:"). # "foo": 1 -> foo: 1
gsub(/(^\s*)(".*?"):/, "\\1\\2 =>") # "123": 1 -> "123" => 1
{
a: 1,
"2" => 3,
"3" => nil
}
Ответ 9
Вот подход с использованием json и rogue:
require 'json'
require 'rouge'
formatter = Rouge::Formatters::Terminal256.new
json_lexer = Rouge::Lexers::JSON.new
puts formatter.format(json_lexer.lex(JSON.pretty_generate(JSON.parse(response))))
(анализирует ответ, например, из RestClient
)
Ответ 10
Для больших вложенных хэшей этот скрипт может быть полезен для вас. Он печатает вложенный хеш с хорошим синтаксисом типа python и содержит только отступы, чтобы его было легко скопировать.
module PrettyHash
# Usage: PrettyHash.call(nested_hash)
# Prints the nested hash in the easy to look on format
# Returns the amount of all values in the nested hash
def self.call(hash, level: 0, indent: 2)
unique_values_count = 0
hash.each do |k, v|
(level * indent).times { print ' ' }
print "#{k}:"
if v.is_a?(Hash)
puts
unique_values_count += call(v, level: level + 1, indent: indent)
else
puts " #{v}"
unique_values_count += 1
end
end
unique_values_count
end
end
Пример использования:
h = {a: { b: { c: :d }, e: :f }, g: :i }
PrettyHash.call(h)
a:
b:
c: d
e: f
g: i
=> 3
Возвращаемым значением является count (3) всех значений конечного уровня вложенного хэша.
Ответ 11
В Rails, массивы и хеши в Ruby имеют встроенные функции to_json. Я бы использовал JSON только потому, что он очень читаем в веб-браузере, например. Google Chrome.
Если вы обеспокоены тем, что это выглядит слишком "технологически выглядящим", вы, вероятно, должны написать свою собственную функцию, которая заменяет фигурные скобки и квадратные фигурные скобки в ваших хэшах и массивах с пробелами и другими символами.
Посмотрите функцию gsub для очень хорошего способа сделать это. Продолжайте играть с разными персонажами и разным количеством пробелов, пока не найдете то, что выглядит привлекательно. http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub