web-dev-qa-db-ja.com

Rubyハッシュを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"}
}

しかし、その文字列への変換を効果的に行う方法は正確にはわかりません。

HASHのドキュメントに目を通しましたが、to_yamlについては何も見つかりませんでした。 to_yamlを検索すると、require yamlのときに使用可能になります。 Enumerableメソッドcollectも使用しようとしましたが、値(別のハッシュ)を反復処理する必要があるときに混乱しました。

参照として「 Rubyでハッシュを文字列に変換する 」を使用しようとしています。私の考えはそれをYAML::loadにフィードし、それが私が望むYAMLを生成することでした。

36
Shail Patel

これが私がそれをする方法です:

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]
57
the Tin Man

あなたはto_yamlの後、これのためにハッシュでrequire yamlメソッドを使用できます

5
Shail Patel