我有一个带有嵌套数组和哈希值的大哈希。我想简单地将其打印出来,以便用户“可读”。
我希望它有点像to_yaml - 这很可读 - 但仍然看起来很科技。
最终,它将成为需要阅读这些数据块的最终用户,因此需要对其进行干净的格式化。
有什么建议吗?
答案 0 :(得分:226)
require 'pp'
pp my_hash
如果您需要内置解决方案,只需要合理的换行符,请使用pp
。
如果您可以安装gem,请使用awesome_print。 (根据您的用户,您可能希望使用index:false
选项关闭显示数组索引。)
答案 1 :(得分:77)
如果你有JSON,我推荐JSON.pretty_generate(hash)
因为它比awesome_print更简单,在pre
标签中看起来很棒,并且允许从网页轻松复制。 (另见:How can I "pretty" format my JSON output in Ruby on Rails?)
答案 2 :(得分:23)
另一种比pp
或awesome_print
更适合我的解决方案:
require 'pry' # must install the gem... but you ALWAYS want pry installed anyways
Pry::ColorPrinter.pp(obj)
答案 3 :(得分:13)
如果你没有任何花哨的gem动作,但确实有JSON,那么这个CLI行将使用哈希:
puts JSON.pretty_generate(my_hash).gsub(":", " =>")
#=>
{
:key1 => "value1",
:key2 => "value2",
:key3 => "value3"
}
答案 4 :(得分:4)
如果您要向用户打印,请使用上面的答案。
如果您只想在控制台中自己打印,我建议使用pry gem而不是irb。除了漂亮的打印,pry还有很多其他功能(请查看下面的railscast)
gem install pry
并查看此railscast:
答案 5 :(得分:1)
使用Pry你只需要将以下代码添加到〜/ .pryrc:
require "awesome_print"
AwesomePrint.pry!
答案 6 :(得分:1)
在我尝试过的所有宝石中,show_data
gem对我来说效果最好,我现在用它来广泛地记录Rails中的params哈希
答案 7 :(得分:1)
如果需要
inspect
inspect
方法,这将很有用...那么这很好用! (而且更好的是,您的Hash对象更大,更嵌套)。
logger.error my_hash.pretty_inspect
例如:
class MyObject1
def inspect
"<#{'*' * 10} My Object 1 #{'*' * 10}>"
end
end
class MyObject2
def inspect
"<#{'*' * 10} My Object 2 #{'*' * 10}>"
end
end
my_hash = { a: 1, b: MyObject1.new, MyObject2.new => 3 }
Rails.logger.error my_hash
# {:a=>1, :b=><********** My Object 1 **********>, <********** My Object 2 **********>=>3}
# EW! ^
Rails.logger.error my_hash.pretty_inspect
# {:a=>1,
# :b=><********** My Object 1 **********>,
# <********** My Object 2 **********>=>3}
pretty_inspect
comes from PrettyPrint,默认情况下包含其中。因此,不需要gem,也无需转换为JSON。
如果您不在Rails中,或者由于某种原因上述操作失败,请首先尝试使用require "pp"
。例如:
require "pp" # <-----------
class MyObject1
def inspect
"<#{'*' * 10} My Object 1 #{'*' * 10}>"
end
end
class MyObject2
def inspect
"<#{'*' * 10} My Object 2 #{'*' * 10}>"
end
end
my_hash = { a: 1, b: MyObject1.new, MyObject2.new => 3 }
puts my_hash
# {:a=>1, :b=><********** My Object 1 **********>, <********** My Object 2 **********>=>3}
# EW! ^
puts my_hash.pretty_inspect
# {:a=>1,
# :b=><********** My Object 1 **********>,
# <********** My Object 2 **********>=>3}
我的项目中的大笔pretty_inspect
编辑了哈希示例,并删除了我检查的对象中特定于项目的文本:
{<***::******************[**:****, ************************:****]********* * ****** ******************** **** :: *********** - *** ******* *********>=>
{:errors=>
["************ ************ ********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
"************ ************ ********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
"************ ************ ********** ***** ****** ******** is invalid",
"************ ************ ********** is invalid",
"************ ************ is invalid",
"************ is invalid"],
:************=>
[{<***::**********[**:****, *************:**, ******************:*, ***********************:****] :: **** **** ****>=>
{:************=>
[{<***::***********[**:*****, *************:****, *******************:**]******* :: *** - ******* ***** - *>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: *** - *>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ********* - *>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ********** - ********** *>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ******** - *>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: **** - *******>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: *** - ********** ***** - *>=>
{}}]}},
{<***::**********[**:****, *************:**, ******************:*, ***********************:****] ******************** :: *** - *****>=>
{:errors=>
["************ ********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
"************ ********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
"************ ********** ***** ****** ******** is invalid",
"************ ********** is invalid",
"************ is invalid"],
:************=>
[{<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
{}},
{<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]*********** :: ****>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *******>=>
{:errors=>
["********** ***** ****** ******** ***** ****** ******** **** ********** **** ***** ***** ******* ******",
"********** ***** ****** ******** ***** ****** ******** **** ********** is invalid",
"********** ***** ****** ******** is invalid",
"********** is invalid"],
:**********************=>
[{<***::*******************[**:******, ************************:***]****-************ ******************** ***: * :: *** - ***** * ****** ** - ******* * **: *******>=>
{:errors=>
["***** ****** ******** **** ********** **** ***** ***** ******* ******",
"***** ****** ******** **** ********** is invalid"],
:***************=>
[{<***::********************************[**:******, *************:******, ***********:******, ***********:"************ ************"]** * *** * ****-******* * ******** * ********* ******************** *********************: ***** :: "**** *" -> "">=>
{:errors=>["**** ***** ***** ******* ******"],
:**********=>
{<***::*****************[**:******, ****************:["****** ***", "****** ***", "****** ****", "******* ***", "******* ****", "******* ***", "****"], **:""] :: "**** *" -> "">=>
{:errors=>
["***** ******* ******",
"***** ******* ******"]}}}}]}}]}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
{}},
{<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
{}},
{<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
{}},
{<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
{}},
{<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
{}},
{<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
{}}]}}]}}
答案 8 :(得分:0)
这是一种使用json和流氓的方法:
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
的响应)
答案 9 :(得分:0)
如果您相信自己的密钥是理智的,则可以轻松使用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
}
答案 10 :(得分:0)
对于大嵌套哈希,此脚本可能对您有所帮助。它以漂亮的python / like语法打印嵌套的哈希,仅带有缩进,以便于复制。
there was a conflict
AssemblyConflicts.txt
返回的值是嵌套哈希的所有最终级别值的计数(3)。
答案 11 :(得分:0)
我通过搜索引擎来到这里,寻找一种以人类可读的格式向最终用户打印哈希的方法,尤其是在键中带有下划线的哈希。
这就是我最终使用Rails 6.0.3.4所做的事情:
hash.map do |key, val|
key.to_s.humanize + ': ' + val.to_s
end.join('; ')
# Turns {:foo_bar => 'baz', :fee_ber => :bez} into 'Foo bar: Baz; Fee ber: Bez'.
答案 12 :(得分:0)
Pretty Print Hash
使用纯 Ruby(无宝石)
我遇到了这个线程,试图为自己解决这个问题。
我有一个很大的 Hash
,我想让它变得漂亮,但我需要使用 ruby 哈希表示法而不是 JSON。
这是代码+示例
symbol:
等价物替换所有 JSON 键puts JSON.pretty_generate(result)
.gsub(/(?:\"|\')(?<key>[^"]*)(?:\"|\')(?=:)(?:\:)/) { |_|
"#{Regexp.last_match(:key)}:"
}
示例 JSON
{
"extensions": {
"heading": "extensions",
"take": "all",
"array_columns": [
"name"
]
},
"tables": {
"heading": "tables",
"take": "all",
"array_columns": [
"name"
]
},
"foreign_keys": {
"heading": "foreign_keys",
"take": "all",
"array_columns": [
"name"
]
},
"all_indexes": {
"heading": "all_indexes",
"take": "all",
"array_columns": [
"name"
]
},
"keys": {
"heading": "keys",
"take": "all",
"array_columns": [
"name"
]
}
}
示例 Ruby 哈希
{
extensions: {
heading: "extensions",
take: "all",
array_columns: [
"name"
]
},
tables: {
heading: "tables",
take: "all",
array_columns: [
"name"
]
},
foreign_keys: {
heading: "foreign_keys",
take: "all",
array_columns: [
"name"
]
},
all_indexes: {
heading: "all_indexes",
take: "all",
array_columns: [
"name"
]
},
keys: {
heading: "keys",
take: "all",
array_columns: [
"name"
]
}
}
答案 13 :(得分:-4)
在Rails下,Ruby中的数组和散列具有内置的to_json函数。我会使用JSON只是因为它在Web浏览器中非常易读,例如谷歌浏览器。
如果你担心它看起来太“看起来像技术”,你应该写自己的功能,用空白和其他字符替换你的哈希和数组中的花括号和方括号。
查找gsub函数以获得一个非常好的方法。继续玩不同的角色和不同数量的空白,直到你找到一些看起来很吸引人的东西。 http://ruby-doc.org/core-1.9.3/String.html#method-i-gsub