web-dev-qa-db-fra.com

Le meilleur moyen d'imprimer un hachage

J'ai un grand hachage avec des tableaux et des hachages imbriqués. Je voudrais simplement l'imprimer pour qu'il soit "lisible" par l'utilisateur.

Je voudrais que ce soit un peu comme to_yaml - c'est assez lisible - mais toujours trop technique. 

En fin de compte, ce sont les utilisateurs finaux qui ont besoin de lire ces fragments de données pour pouvoir être formatés proprement.

Aucune suggestion?

148
Adam O'Connor
require 'pp'
pp my_hash

Utilisez pp si vous avez besoin d’une solution intégrée et souhaitez simplement des sauts de ligne raisonnables.

Utilisez awesome_print si vous pouvez installer une gemme. (En fonction de vos utilisateurs, vous pouvez utiliser l'option index:false pour désactiver l'affichage des index de tableaux.)

221
Phrogz

Si vous avez le format JSON, je recommande JSON.pretty_generate(hash) car il est plus simple que awesome_print , est superbe dans une balise pre et permet une copie facile depuis une page Web. (Voir aussi: Comment puis-je "joli" formater ma sortie JSON dans Ruby on Rails? )

75
David J.

Une autre solution qui fonctionne mieux pour moi que pp ou awesome_print:

require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
22
Alex D

Utilisez les réponses ci-dessus si vous imprimez aux utilisateurs.

Si vous voulez seulement l'imprimer pour vous-même dans la console, je suggère d'utiliser le joyau de levier au lieu d'irb En plus de jolies impressions, le levier présente de nombreuses autres fonctionnalités (consultez la diffusion sur rail ci-dessous).

bijou installer un levier

Et vérifiez cette diffusion sur rail:

http://railscasts.com/episodes/280-pry-with-Rails

4
Abdo

De tous les joyaux que j'ai essayés, show_data gem fonctionnait le mieux pour moi, je l'utilise maintenant beaucoup pour enregistrer le hachage des paramètres dans Rails pratiquement tout le temps

1
Dr.Strangelove

En utilisant Pry il vous suffit d’ajouter le code suivant à votre ~/.pryrc:

require "awesome_print"
AwesomePrint.pry!
1
bartoindahouse

Pour les grandes hachages imbriquées, ce script peut vous être utile. Il imprime un hachage imbriqué dans une syntaxe Nice/python avec des retraits pour faciliter la copie.

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

Exemple d'utilisation:

  h = {a: { b: { c: :d }, e: :f }, g: :i }
  PrettyHash.call(h)

a:
  b:
    c: d
  e: f
g: i
=> 3

La valeur renvoyée est le nombre (3) de toutes les valeurs de niveau de fin du hachage imbriqué.

0
swilgosz

Voici une approche utilisant JSON et 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))))

(analyse la réponse, par exemple, de RestClient)

0
Adobe

Facile à faire avec json si vous faites confiance à vos clés:

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
}
0
grosser