Converteer Ruby Hash naar YAML

Ik moet een hash, zoals hieronder weergegeven, converteren naar leesbare YAML. Het lijkt erop dat ik YAML::loadeen string kan invoeren, maar ik denk dat ik deze eerst moet converteren naar zoiets als dit:

hostname1.test.com:
  public: 51
  private: 10
{"hostname1.test.com"=>
   {"public"=>"51", "private"=>"10"},
 "hostname2.test.com"=>
   {"public"=>"192", "private"=>"12"}
}

Ik weet echter niet precies hoe ik die conversie naar die string effectief moet uitvoeren.

Ik heb de HASH-documentatie bekeken en kon niets vinden voor to_yaml. Ik vond het door te zoeken naar to_yamldie beschikbaar komt wanneer je require yaml. Ik heb ook geprobeerd de Enumerable-methode collectte gebruiken, maar raakte in de war toen ik de waarde moest herhalen (nog een hash).

Ik probeer “Hash converteren naar string in Rubyte gebruiken ” als een referentie. Mijn gedachte was toen om dat in YAML::loadin te voeren en dat zou de YAML genereren die ik wilde.


Antwoord 1, autoriteit 100%

Zo zou ik het doen:

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

Welke uitgangen:

---
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'

De klasse Object heeft een methode to_yaml. Ik heb dat gebruikt en het genereerde het YAML-bestand correct.

Nee, dat doet het niet.

Dit is van een vers geopende IRB-sessie:

Object.instance_methods.grep(/to_yaml/)
=> []
require 'yaml'
=> true
Object.instance_methods.grep(/to_yaml/)
=> [:psych_to_yaml, :to_yaml, :to_yaml_properties]

Antwoord 2, autoriteit 9%

Je kunt hiervoor volgens mij de to_yamlmethode op een hash gebruiken nadat je require yaml


Antwoord 3

U kunt YAML.dump:

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

Een voordeel van YAML.dumpten opzichte van to_yamlis dat het gemakkelijker is om af te leiden wat de code doet, omdat de meeste mensen van links naar rechts lezen.

Other episodes