Как я могу конвертировать вложенный YAML во вложенные массивы и OpenStructs в Ruby

Как мне преобразовать серию вложенных хешей (вложенных в произвольную глубину) в серию вложенных OpenStructs? Я загружаю в большой файл YAML, и я не наслаждаюсь accessing['everything']['like']['this'],

Я нашел несколько частичных решений с помощью Google, но я подумал, что это может составить хороший вопрос здесь.

Вот одно из решений, которое я нашел на http://andreapavoni.com/blog/2013/4/create-recursive-openstruct-from-a-ruby-hash:

# deep_struct.rb
require 'ostruct'

class DeepStruct < OpenStruct
  def initialize(hash=nil)
    @table = {}
    @hash_table = {}

    if hash
      hash.each do |k,v|
        @table[k.to_sym] = (v.is_a?(Hash) ? self.class.new(v) : v)
        @hash_table[k.to_sym] = v

        new_ostruct_member(k)
      end
    end
  end

  def to_h
    @hash_table
  end

end

Проблема этого решения в том, что оно не учитывает массивы.

1 ответ

Решение

Есть решение ( https://github.com/jsuchal/hashugar), которое я часто использую.

opts = Hashugar.new({:a => 1, 'b' => {:c => 2, :d => [3, 4, {:e => 5}]}})

Но вам также нужно сделать:

opts.b.d.last.e

Я не понимаю, как вы хотите назвать геттеры массива. Как сказал Аруп Ракшит: приведите пример yaml и ожидаемый результат или поведение.

Другие вопросы по тегам