将 Ruby 哈希表转换为 YAML

52

我需要将提供的哈希值转换为可读的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后才能使用它。我尝试使用可枚举方法collect,但当需要迭代值(另一个哈希)时变得困惑。

我试图以Ruby中将哈希转换为字符串作为参考。我的想法是将其馈入YAML::load,这样就会生成我想要的YAML。


你有没有仔细阅读过Ruby的YAML文档?还有YamlForRuby网站上的“Yaml Cookbook”?此外,你提供的哈希值无效。它应该是哈希数组还是哈希哈希? - the Tin Man
你也应该提供你尝试过的代码,并解释一下哪些地方出了问题。如果没有展示任何努力,则扣1分。 - the Tin Man
添加了在发现to_yaml方法之前所做的工作。 - Shail Patel
1
to_yaml 不是 Hash 或 Object 或任何类的默认部分。你必须在脚本中的某个地方,或者在你需要的东西中 require 'yaml',才能让 YAML 扩展 Object、Hash 和其他方法。请参见我的回答进行编辑。 - the Tin Man
3个回答

74

这是我会做的方式:

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]

6

在你require yaml之后,我相信你可以使用to_yaml方法来处理哈希表。


2
哈希没有 to_yaml 方法。 - the Tin Man
6
该对象不具备to_yaml方法。只有YAML类具备该方法,并且在需要时会扩展其他类。请注意,此处为否定句,意思是该对象没有to_yaml方法。 - the Tin Man

2
您可以使用 YAML.dump 方法进行操作:
YAML.dump(a: 2, b: 1)
=> "---\n:a: 2\n:b: 1\n
< p >使用YAML.dump相比于to_yaml的一个优势是,它更容易推断代码正在做什么,因为大多数人从左到右阅读。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接