Подтвердить что ты не робот

Преобразование 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"}
}

Я не уверен точно, как сделать это преобразование в эту строку эффективно.

Я просмотрел документацию HASH и ничего не нашел для to_yaml. Я нашел его, выполнив поиск to_yaml, который станет доступен, когда вы require yaml. Я также попытался использовать метод Enumerable collect, но запутался, когда мне нужно было перебрать значение (другой хеш).

Я пытаюсь использовать "Преобразование хэша в строку в Ruby" в качестве ссылки. Моя мысль заключалась в том, чтобы передать это в YAML::load, и это создало бы YAML, который я хотел.

4b9b3361

Ответ 1

Вот как бы я это сделал:

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]

Ответ 2

Вы можете использовать метод to_yaml для хэша для этого, я верю после вас require yaml