【问题标题】:Convert Ruby Hash into YAML将 Ruby 哈希转换为 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 或任何类。你HAVErequire 'yaml'脚本中的某个地方,或者你需要的地方,让YAML扩展对象、哈希和其他方法。请参阅我的答案的编辑。

标签: ruby hash 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

    【讨论】:

    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-30
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2011-06-29
      • 2016-08-26
      相关资源
      最近更新 更多