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