2013-07-10 6 views
27

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

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, и это создало бы ЯМЛ, которого я хотел.

+0

Вы прочитал [документации YAML] Руби (http://www.ruby-doc.org/stdlib-2.0/libdoc/yaml/rdoc /YAML.html)? Как насчет «[Yaml Cookbook на сайте YamlForRuby] (http://www.yaml.org/YAML_for_ruby.html)? Также недопустимый ваш хэш-код. Если это массив хэшей или хэш хэшей ? –

+0

Вы также должны были указать код, показывающий, что вы пробовали, а также объяснение того, что не сработало. -1 для не проявляющих никаких усилий. –

+0

Добавлена ​​работа, которую я сделал до поиска метода to_yaml. –

ответ

45

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

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' 

Класс объекта имеет _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

+2

У хэша нет метода 'to_yaml'. –

+5

[Object does * not * имеет метод' to_yaml'] (http://ruby-doc.org/core-2.0/Object.html). Этот класс имеет только класс [YAML] (http://ruby-doc.org/stdlib-2.0/libdoc/yaml/rdoc/YAML.html), и он расширяет другие классы когда это необходимо. –

Смежные вопросы