漂亮打印哈希的最佳方法

Ada*_*nor 160 ruby ruby-on-rails-3

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

我希望它有点像to_yaml - 这很可读 - 但仍然看起来很科技.

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

有什么建议?

Phr*_*ogz 240

require 'pp'
pp my_hash
Run Code Online (Sandbox Code Playgroud)

使用pp如果你需要一个内置的解决方案,只是想合理的换行符.

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


Dav*_* J. 88

如果您有JSON,我建议,JSON.pretty_generate(hash)因为它比awesome_print更简单,在pre标签中看起来很棒,并且允许从网页轻松复制.(另请参阅:如何在Ruby on Rails中"漂亮"格式化我的JSON输出?)

  • 它将是`puts JSON.pretty_generate(hash)` (8认同)

Ale*_*x D 24

另一种解决方案,比工作更好地为我ppawesome_print:

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

  • 请注意,`Pry :: ColorPrinter.pp(obj)`写入标准输出但可以使用其他参数,包括目标.比如`Pry :: ColorPrinter.pp(obj,a_logger)` (2认同)

Nic*_*rer 17

如果您没有任何花哨的gem动作,但确实有JSON,则此CLI行将处理哈希:

puts JSON.pretty_generate(my_hash).gsub(":", " =>")

#=>
{
  :key1 => "value1",

  :key2 => "value2",

  :key3 => "value3"
}
Run Code Online (Sandbox Code Playgroud)

  • Downvoted,因为这会弄乱任何包含":"的键和值 (7认同)

pdo*_*obb 7

在轨道中

如果你需要

  • 一个“漂亮打印”的哈希值
  • 例如在 Rails.logger 中
  • 具体来说,inspect在哈希中的对象上 运行
    • inspect如果您像您应该的那样重写/定义对象中的方法,这很有用

...那么这很好用!(哈希对象越大、嵌套越多,效果就会越好。)

logger.error my_hash.pretty_inspect
Run Code Online (Sandbox Code Playgroud)

例如:

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}
Run Code Online (Sandbox Code Playgroud)

pretty_inspect来自 PrettyPrint,rails 默认包含它。因此,不需要 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}
Run Code Online (Sandbox Code Playgroud)

一个完整的例子

我的项目中的Big ol' pretty_inspected Hash 示例,其中包含来自我检查的对象的项目特定文本:

{<***::******************[**:****, ************************:****]********* * ****** ******************** **** :: *********** - *** ******* *********>=>
  {: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=>
                            ["***** ******* ******",
                             "***** ******* ******"]}}}}]}}]}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:**]******* :: ****** - ** - *********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - ********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}},
          {<***::***********[**:*****, *************:****, *******************:***]******* :: ****** - ** - **********>=>
            {}}]}}]}}
Run Code Online (Sandbox Code Playgroud)


Dav*_*wys 7

使用纯 Ruby 进行漂亮的打印Hash(无宝石)

我遇到这个线程试图为自己解决这个问题。

我有一个很大的Hash东西,我想把它做得漂亮,但我需要保留 ruby​​ 哈希符号而不是 JSON。

这是代码+示例

  • 使用 Pretty_generate 获取格式良好的 JSON 字符串。
  • 将所有 JSON 键替换为symbol:等效键
puts JSON.pretty_generate(result)
         .gsub(/(?:\"|\')(?<key>[^"]*)(?:\"|\')(?=:)(?:\:)/) { |_|
              "#{Regexp.last_match(:key)}:"
          }
Run Code Online (Sandbox Code Playgroud)

示例 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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

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"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)