将 Ruby 哈希转换为 YAML
Posted
技术标签:
【中文标题】将 Ruby 哈希转换为 YAML【英文标题】:Convert Ruby Hash into YAML 【发布时间】:2013-07-08 17:26:55 【问题描述】:我需要将下面提供的哈希转换为可读的 YAML。看起来我可以提供 YAML::load
一个字符串,但我想我需要先将它转换成这样的:
hostname1.test.com:
public: 51
private: 10
"hostname1.test.com"=>
"public"=>"51", "private"=>"10",
"hostname2.test.com"=>
"public"=>"192", "private"=>"12"
我不确定如何有效地转换成该字符串。
我查看了 HASH 文档,但找不到 to_yaml
的任何内容。我通过搜索to_yaml
找到了它,当你require yaml
时它变得可用。我还尝试使用 Enumerable 方法collect
,但是当我需要遍历值(另一个哈希)时感到困惑。
我正在尝试使用“Converting hash to string in Ruby”作为参考。然后我的想法是将其输入到YAML::load
中,这将生成我想要的 YAML。
【问题讨论】:
你读过Ruby的YAML documentation吗? "Yaml Cookbook at the YamlForRuby site 怎么样?另外,您提供的哈希无效。它应该是哈希数组还是哈希哈希? 您还应该提供代码来显示您尝试过的内容,以及对无效内容的说明。 -1 表示没有表现出任何努力。 添加了我在找到 to_yaml 方法之前所做的工作。to_yaml
默认情况下不属于 Hash 或 Object 或任何类。你HAVE到require 'yaml'
脚本中的某个地方,或者你需要的地方,让YAML扩展对象、哈希和其他方法。请参阅我的答案的编辑。
【参考方案1】:
你可以使用YAML.dump
:
YAML.dump(a: 2, b: 1)
=> "---\n:a: 2\n:b: 1\n
YAML.dump
相对于to_yaml
的一个优势是更容易推断代码在做什么,因为大多数人是从左到右阅读的。
【讨论】:
【参考方案2】:您可以在哈希上使用to_yaml
方法,我相信在您之后require yaml
【讨论】:
哈希没有to_yaml
方法。
Object does not have a to_yaml
method。只有YAML 类有它,它会在需要时扩展其他类。【参考方案3】:
我会这样做:
require 'yaml'
HASH_OF_HASHES =
"hostname1.test.com"=> "public"=>"51", "private"=>"10",
"hostname2.test.com"=> "public"=>"192", "private"=>"12"
ARRAY_OF_HASHES = [
"hostname1.test.com"=> "public"=>"51", "private"=>"10",
"hostname2.test.com"=> "public"=>"192", "private"=>"12"
]
puts HASH_OF_HASHES.to_yaml
puts
puts ARRAY_OF_HASHES.to_yaml
哪些输出:
---
hostname1.test.com:
public: '51'
private: '10'
hostname2.test.com:
public: '192'
private: '12'
---
- hostname1.test.com:
public: '51'
private: '10'
- hostname2.test.com:
public: '192'
private: '12'
Object 类有一个 to_yaml 方法。我使用了它,它正确地生成了 YAML 文件。
不,它没有。
这是来自新打开的 IRB 会话:
Object.instance_methods.grep(/to_yaml/)
=> []
require 'yaml'
=> true
Object.instance_methods.grep(/to_yaml/)
=> [:psych_to_yaml, :to_yaml, :to_yaml_properties]
【讨论】:
以上是关于将 Ruby 哈希转换为 YAML的主要内容,如果未能解决你的问题,请参考以下文章