关于ruby:打印哈希的最好方法

Best way to pretty print a hash

我有一个包含嵌套数组和哈希的大哈希。我只想简单地打印出来,以便用户"可读"。

我希望它有点像"山药"——可读性很好——但看起来还是太科技化了。

最终,它将成为最终用户,他们需要读取这些数据块,这样他们就需要被清晰地格式化。

有什么建议吗?


1
2
require 'pp'
pp my_hash

如果您需要一个内置的解决方案并且只需要合理的换行,那么就使用pp

如果可以安装宝石,请使用Awesome_print。(根据用户的不同,您可能希望使用index:false选项关闭显示阵列索引。)


如果你有json,我推荐JSON.pretty_generate(hash),因为它比Awesome打印简单,在pre标签中看起来很棒,并且允许从网页轻松复制。(另请参见:如何在RubyonRails中"漂亮地"格式化JSON输出?)


另一个比ppawesome_print更适合我的解决方案:

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


如果您没有任何花哨的gem操作,但是有json,那么这个cli行将在哈希上工作:

江户十一〔七〕号

1
2
3
4
5
6
7
8
#=>
{
  :key1 =>"value1",

  :key2 =>"value2",

  :key3 =>"value3"
}


如果要打印给用户,请使用上面的答案。

如果你只想在控制台上自己打印,我建议你使用PryGem而不是IRB。除了漂亮的打印,Pry还有很多其他功能(请查看下面的RailsCast)

gem install pry

检查一下这条铁路:

http://railscansts.com/ci集/280-pry-with-rails


如果您相信您的密钥是健全的,那么使用JSON很容易:

1
2
3
4
5
6
7
8
9
10
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
}


在我尝试的所有gem中,show_datagem对我来说工作得最好,我现在广泛地使用它来记录Rails中的参数哈希,几乎总是如此。


使用pry,只需将以下代码添加到~/.pryrc:

1
2
require"awesome_print"
AwesomePrint.pry!


下面是使用JSON和Rogue的方法:

1
2
3
4
5
6
7
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的响应)


在Rails下,Ruby中的数组和散列有内置到JSON函数。我之所以使用JSON,仅仅是因为它在Web浏览器(如Google Chrome)中非常可读。

也就是说,如果您担心它看起来太"技术性"了,那么您应该编写自己的函数,用空格和其他字符替换散列和数组中的大括号和方括号。

查找gsub函数以获得一个非常好的方法。一直玩着不同的字符和不同数量的空白,直到你找到一些吸引人的东西。http://ruby doc.org/core-1.9.3/string.html method-i-gsub