Ruby 打印散列的最佳方法

Ruby 打印散列的最佳方法,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,我有一个包含嵌套数组和散列的大散列。我想简单地把它打印出来,让用户“可读” 我希望它有点像yaml——这是相当可读的——但还是太科技化了 最终,它将成为需要读取这些数据块的最终用户,因此需要对其进行干净的格式化 有什么建议吗?在Rails下,Ruby中的数组和散列都内置了json函数。我会使用JSON,只是因为它在web浏览器(例如Google Chrome)中可读性很强 这就是说,如果您担心它看起来太“技术化”,您可能应该编写自己的函数,用空格和其他字符替换哈希和数组中的花括号和方括号 查找g

我有一个包含嵌套数组和散列的大散列。我想简单地把它打印出来,让用户“可读”

我希望它有点像yaml——这是相当可读的——但还是太科技化了

最终,它将成为需要读取这些数据块的最终用户,因此需要对其进行干净的格式化


有什么建议吗?

在Rails下,Ruby中的数组和散列都内置了json函数。我会使用JSON,只是因为它在web浏览器(例如Google Chrome)中可读性很强

这就是说,如果您担心它看起来太“技术化”,您可能应该编写自己的函数,用空格和其他字符替换哈希和数组中的花括号和方括号

查找gsub函数以获得一种非常好的方法。继续玩不同的字符和不同数量的空白,直到你发现一些看起来很吸引人的东西

如果您需要内置解决方案并且只需要合理的换行符,请使用


如果可以安装gem,请使用。(根据用户的不同,您可能希望使用
index:false
选项来关闭数组索引的显示。)

如果您有JSON,我建议您使用
JSON.pretty_generate(hash)
,因为它比
pre
标记简单,看起来很棒,并且允许从网页轻松复制。(另请参见:)

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

如果您只想在控制台中为自己打印,我建议使用pry gem而不是irb。除了漂亮的印刷外,pry还有许多其他功能(查看下面的railscast)

宝石安装撬

并查看此railscast:


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

require "awesome_print"
AwesomePrint.pry!

另一个比
pp
awesome\u print
更适合我的解决方案:

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

在我尝试的所有gem中,
show_data
gem对我来说效果最好,我现在经常使用它在Rails中记录params散列值

如果您没有任何奇特的gem操作,但是有JSON,那么这个CLI行将在散列上工作:

放入JSON.pretty\u generate(my\u hash).gsub(“:”,“=>”)


下面是使用json和rouge的另一种方法:

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
的响应)

如果您相信您的密钥是正常的,那么使用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
}

对于大型嵌套哈希,此脚本可能会对您有所帮助。它以一种很好的python/类语法打印一个嵌套的散列,只带有缩进,以便于复制

模块PrettyHash
#用法:PrettyHash.call(嵌套的\u散列)
#以易于查看的格式打印嵌套哈希
#返回嵌套哈希中所有值的数量
def self.call(散列,级别:0,缩进:2)
唯一\u值\u计数=0
hash.each do | k,v|
(级别*缩进).times{print'}
打印“#{k}”:
如果v.is_a?(散列)
放
唯一\u值\u计数+=调用(v,级别:级别+1,缩进:缩进)
其他的
放置“#{v}”
唯一\u值\u计数+=1
结束
结束
唯一\u值\u计数
结束
结束
用法示例: 返回值是Rails中嵌套哈希的所有末级值的计数(3)。

如果你需要

  • “打印得很好”的散列
  • 例如,在Rails.logger中
  • 具体来说,在散列中的对象上运行
    inspect
    • 如果您像预期的那样在对象中重写/定义
      inspect
      方法,这将非常有用
。。。那么这个效果很好!(而且越大越好,哈希对象越嵌套。)

logger.error my\u hash.pretty\u inspect
例如:

类MyObject1
def检查
""
结束
结束
类MyObject2
def检查
""
结束
结束
my_hash={a:1,b:MyObject1.new,MyObject2.new=>3}
Rails.logger.error my_散列
#{:a=>1,:b=>,=>3}
#哎哟!^
Rails.logger.error my\u hash.pretty\u inspect
#{:a=>1,
#:b=>,,
#  =>3}
,默认情况下,rails包括。因此,不需要gems,也不需要转换为JSON

不在轨道上 如果您不在Rails中,或者由于某种原因上述操作失败,请首先尝试使用
require“pp”
。例如:

需要“pp”#3}
放我的杂烩
#{:a=>1,:b=>,=>3}
#哎哟!^
把我的杂凑,漂亮的
#{:a=>1,
#:b=>,,
#  =>3}

一个完整的例子 Big ol'
pretty_inspect
ed Hash示例(来自我的项目),其中编辑了我检查对象中的项目特定文本:

{=>
{:错误=>
["************ ************ ********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
“******************************************************************************************************************************************无效”,
“**************************************无效”,
“*************************************无效”,
“*******************无效”,
“**********无效”],
:************=>
[{=>
{:************=>
[{=>
{}},
{=>
{}},
{=>
{}},
{=>
{}},
{=>
{}},
{=>
{}},
{=>
{}}]}},
{=>
{:错误=>
["************ ********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
“*****************************************************************************************无效”,
“*****************************************无效”,
“*******************无效”,
“**********无效”],
:************=>
[{=>
{}},
{=>
{}},
{=>
{}},
{=>
{}},
{=>
{}},
{=>
{}},
{=>
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))))
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
}
  h = {a: { b: { c: :d }, e: :f }, g: :i }
  PrettyHash.call(h)

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