【问题标题】:How Can I Convert Nested YAML to nested Arrays and OpenStructs in Ruby如何在 Ruby 中将嵌套 YAML 转换为嵌套数组和 OpenStruct
【发布时间】:2013-06-07 18:39:56
【问题描述】:

我应该如何将一系列嵌套哈希(嵌套到任意深度)转换为一系列嵌套 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

这个解决方案的问题是它没有考虑数组。

【问题讨论】:

  • 解决方案不起作用吗?
  • @SergioTulentsev 是的,他们似乎还可以,但我很想看看人们正在使用的其他解决方案,这是一个尚未被问到的问题。
  • 你为什么不发布几个并告诉你为什么不喜欢它们?
  • 您期望数组的哪种行为?
  • @tlewin 反序列化 YAML 由数组和哈希组成,所以我想要数组和 OpenStructs。

标签: ruby hash nested object-graph openstruct


【解决方案1】:

有我经常使用的解决方案(https://github.com/jsuchal/hashugar)。

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

但你还需要这样做:

opts.b.d.last.e

我不明白你想如何命名数组的 getter。正如 Arup Rakshit 所说:给我们 yaml 示例和预期的输出或行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 2019-03-28
    • 2015-08-12
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    相关资源
    最近更新 更多