2013-06-07 8 views
1

중첩 된 해시 (중첩 된 임의의 깊이)를 일련의 중첩 된 OpenStructs로 변환해야하는 방법은 무엇입니까? 큰 YAML 파일로로드 중이며 accessing['everything']['like']['this']을 즐기고 있지 않습니다.중첩 된 YAML을 중첩 된 배열 및 Ruby의 OpenStructs로 변환하는 방법

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 

문제가 계정에 배열을하지 않는다는 것입니다.

+0

솔루션이 작동하지 않습니까? –

+0

@SergioTulentsev 네, 그들은 괜찮은 것처럼 보이지만 사람들이 사용하고있는 다른 솔루션을 보는 데 관심이 있습니다. 질문이 없습니다. – Undistraction

+3

당신은 왜 그들 중 몇 가지를 게시하지 않으며 왜 당신이 그들을 좋아하지 않는 말해? –

답변

2

자주 사용하는 해결책이 있습니다 (https://github.com/jsuchal/hashugar).

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

은 그러나 당신은 또한 수행해야합니다

opts.b.d.last.e

난 당신이 배열의 게터 이름을 지정할 어떻게 이해하지 않습니다. Arup Rakshit은 다음과 같이 말했습니다. yaml 예제와 기대되는 결과물 또는 행동을 제공하십시오.