Лучший способ довольно печатать хэш

У меня большой хэш с вложенными массивами и хешами. Я хотел бы просто распечатать его, чтобы он был "читабельным" для пользователя.

Я бы хотел, чтобы это было похоже на to_yaml - это довольно читаемое, но все же слишком технологичное.

В конечном итоге это будут конечные пользователи, которым необходимо прочитать эти куски данных, чтобы их нужно было отформатировать в чистоте.

Любые предложения?

Ответ 1

require 'pp'
pp my_hash

Используйте pp, если вам нужно встроенное решение и просто хотите разумные разрывы строк.

Используйте awesome_print, если вы можете установить драгоценный камень. (В зависимости от ваших пользователей вы можете использовать параметр index:false, чтобы отключить отображение индексов массива.)

Ответ 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