将Ruby Hash转换为YAML

Sha*_*tel 37 ruby hash yaml

我需要将下面提供的哈希转换为可读的YAML.看起来我可以提供YAML::load一个字符串,但我想我需要先将它转换成这样的东西:

hostname1.test.com:
  public: 51
  private: 10

{"hostname1.test.com"=>
   {"public"=>"51", "private"=>"10"},
 "hostname2.test.com"=>
   {"public"=>"192", "private"=>"12"}
}
Run Code Online (Sandbox Code Playgroud)

我不确定如何有效地转换成该字符串.

我查看了HASH文档,找不到任何内容to_yaml.我找到了它,通过搜索to_yaml哪个可用require yaml.我也尝试使用Enumerable方法,collect但在需要迭代值(另一个哈希)时感到困惑.

我正在尝试使用" 将Ruby转换为Ruby中的字符串 "作为参考.我的想法是把它喂入,YAML::load这会产生我想要的YAML.

the*_*Man 58

这是我如何做到的:

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

哪个输出:

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

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


Sha*_*tel 5

你可以to_yaml在哈希上使用这个方法,我相信你require yaml

  • [对象确实*没有'to_yaml`方法](http://ruby-doc.org/core-2.0/Object.html).只有[YAML](http://ruby-doc.org/stdlib-2.0/libdoc/yaml/rdoc/YAML.html)类具有它,并且在需要时扩展其他类. (6认同)
  • 哈希没有`to_yaml`方法. (2认同)