如何更改 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"}
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" }
请注意,您建议的输出在一定程度上受到限制。它实际上只适用于 Symbol
s 的键和 String
s 的值,而在 Ruby 中,键可以是 任意对象 值可以是任意对象.
此外,您建议的输出与 #inspect
的目标完全相反,即提供人类可读的调试输出,因为密钥不是字符串这一点不容易看到。
我有以下哈希:
{"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"}
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" }
请注意,您建议的输出在一定程度上受到限制。它实际上只适用于 Symbol
s 的键和 String
s 的值,而在 Ruby 中,键可以是 任意对象 值可以是任意对象.
此外,您建议的输出与 #inspect
的目标完全相反,即提供人类可读的调试输出,因为密钥不是字符串这一点不容易看到。