2014-09-29 99 views
0

我有两个我已经序列化的YAML文件。Ruby:添加哈希/合并YAML对象

“PP” 来自

ἀγαπάω: 
    present: ἀγαπάω 
    future: ἀγαπήσω 
    aorist: ἠγάπησα 

...更多...

“词素” 来自

ἀγαπάω: 
    pos: V 
    bdag-headword: ἀγαπάω 
    strongs: 25 
    gloss: I love 
...many more... 

我试图添加值“光泽“和”强“到”pp“,否则将pp值与这些来自词位的新值合并。显然ruby不允许插入新值,同时迭代散列。到目前为止,我有:

pps = Hash.new 
pp.each do |p| 
lexemes.each do |lex, arr| 
    if lex.match /^#{p[0]}$/ 
    #match found 
    puts "p #{p[0]} ... lex #{lex}...#{arr['strongs']}....#{arr['gloss']} . 
    (pps[p[0]] ||= []) << p 
    pps[p[0]].push(:strongs => arr['strongs'], :gloss => arr['gloss']) 
    end 
end 
end 

其倾倒收益时:

"ἀγαπάω": 
- - "ἀγαπάω" 
    - present: "ἀγαπάω" 
    future: "ἀγαπήσω" 
    aorist: "ἠγάπησα" 
- :strongs: 25 
    :gloss: I love 

当我真的想:

ἀγαπάω: 
    present: ἀγαπάω 
    future: ἀγαπήσω 
    aorist: ἠγάπησα 
    strongs: 25 
    gloss: I love 

任何想法,/我应该如何管理新数据的插入?

谢谢!

回答

1

此构造是Array的初始化,试图避免它。并合并两个Hash es只用#merge方法如此:

h1 = { h1: { hh1: 1, hh2: 2}} 
# => {:h1=>{:hh1=>1, :hh2=>2}} 
h2 = { h1: { hh3: 3, hh4: 4}} 
# => {:h1=>{:hh3=>3, :hh4=>4}} 
h1[:h1].merge(h2[:h1]) 
# => {:hh1=>1, :hh2=>2, :hh3=>3, :hh4=>4}