YAML / Ruby: получить первый предмет, у которого <field>равно <value>? - PullRequest
3 голосов
/ 22 августа 2011

У меня есть YAML:

- company: 
  - id: toyota
  - fullname: トヨタ自動車株式会社
- company:
  - id: konami
  - fullname: Konami Corporation

И я хочу получить полное имя компании, чей идентификатор konami.

Использование Ruby 1.9.2, какой самый простой / обычный способ получить его?

Примечание: В остальной части моего кода я использовал require "yaml", поэтому я бы предпочел использовать ту же библиотеку.

Ответы [ 2 ]

3 голосов
/ 22 августа 2011

Это тоже работает и не использует итерацию:

y = YAML.load_file('japanese_companies.yml')
result = y.select{ |x| x['company'].first['id'] == 'konami' }
result.first['company'].last['fullname'] # => "Konami Corporation"

Или, если у вас есть другие атрибуты, и вы не можете быть уверены, fullname является последним:

result.first['company'].select{ |x| x['fullname'] }.first['fullname']

Я согласен с Ray Toal, если вы измените свой yml, это станет намного проще. E.g.:

toyota:
  fullname: トヨタ自動車株式会社
konami:
  fullname: Konami Corporation

При использовании вышеупомянутого yaml получение полного имени конами становится намного проще:

y = YAML.load_file('test.yml')
y.fetch('konami')['fullname']
1 голос
/ 22 августа 2011

Ваш YAML немного нетрадиционен, но мы можем компенсировать.

Подход грубой силы (я не уверен, что это можно сделать без анализа YAML):

require 'yaml'

YAML.parse_file(ARGV[0]).transform.each do |company|
  properties = {}
  company['company'].each {|h| properties = properties.merge(h)}
  puts properties['fullname'] if properties['id'] == 'konami'
end

Передайте файл YAML в качестве первого аргумента этого сценария.

Не стесняйтесь адаптироваться к методу, который принимает YAML в виде строки и возвращает желаемое полное имя.(Возврат полезен, потому что он прямо отвечает на вопрос ОП о получении первой такой компании.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...