如何更改 Ruby 的散列 return 格式

How to change hash return format for Ruby

我有以下哈希:

{"description":"Hello","id":"H"}`

如果我在控制台中输入哈希值,我会得到:

{:description=>"Hello", :id=>"H"}

我希望它 return 使用 "description""id" 与前面提到的相同形式。

有没有办法更改我的哈希 returned 的格式?

hash = {:description=>"HS - Hours", :id=>"HS"}

hash.stringify_keys
=> {"description"=>"HS - Hours", "id"=>"HS"}

你有一个Hash with Symbol键:

h = {"description": "Hello", "id": "H"}

考虑这个:

({"description": "Hello", "id": "H"}) == ({"description"=> "Hello", "id"=> "H"})
#=> false

({"description": "Hello", "id": "H"}) == ({description: "Hello", id: "H"})
#=> true

Ruby 只是在打印时删除 ":

p ({"description":"Hello","id":"H"})
#=> {:description=>"Hello", :id=>"H"}

如果要将密钥转换为 String, you could use pure Ruby Hash#transform_keys(或 bang 版本 transform_keys!):

h.transform_keys &:to_s
#=> {"description"=>"Hello", "id"=>"H"}

如果 json 是您要查找的内容,请执行以下操作:

require 'json'

puts h.to_json
#=> {"description":"Hello","id":"H"}

还请考虑:

h.to_json.class #=> String
h.class #=> Hash

用于提供对象的人类可读表示的方法是#inspect。这也是大多数 REPL 用来显示对象的方法,尽管有些 REPL 使用其他 REPL 特定的方法,例如 #pretty_inspect.

非常重要的是,所有这些方法 仅供人类食用。您不得解析它们的输出,您不得将它们用于序列化、处理或除查找它们以外的任何用途仅用于调试目的.

因此,知道有问题的方法是 Hash#inspect,您可以尝试覆盖该方法。请注意,永远不要在生产代码中更改核心方法的行为。这是 仅此答案的示例:

module HashPrettyPrintExtension
  def inspect
    '{ ' <<
      map do |k, v|
        k = k.to_s if k.is_a?(Symbol)
        %Q[#{k.inspect}: #{v.inspect}]
      end.join(', ') <<
        ' }'
  end
end

module HashPrettyPrintRefinement
  refine Hash do
    prepend HashPrettyPrintExtension
  end
end

{ "description": "Hello", "id": "H" }
#=> { :description => "Hello", :id => "H" }

using HashPrettyPrintRefinement

{ "description": "Hello", "id": "H" }
#=> { "description": "Hello", "id": "H" }

请注意,您建议的输出在一定程度上受到限制。它实际上只适用于 Symbols 的键和 Strings 的值,而在 Ruby 中,键可以是 任意对象 值可以是任意对象.

此外,您建议的输出与 #inspect 的目标完全相反,即提供人类可读的调试输出,因为密钥不是字符串这一点不容易看到。