49

我需要将下面提供的哈希转换为可读的 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。

4

3 回答 3

70

这是我的做法:

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]
于 2013-07-10T17:10:22.097 回答
6

您可以to_yaml在哈希上使用该方法,我相信在您之后require yaml

于 2013-07-10T16:55:55.463 回答
1

您可以使用YAML.dump

YAML.dump(a: 2, b: 1)
=> "---\n:a: 2\n:b: 1\n

YAML.dumpover的一个优点to_yaml是更容易推断代码在做什么,因为大多数人是从左到右阅读的。

于 2020-09-10T19:38:42.000 回答