Создайте хеш с другими хешами - PullRequest
3 голосов
/ 16 апреля 2011

Я хочу присоединиться к 2 или более таким хэшам.

h1 = { :es => { :hello  => "You" } }
h2 = { :es => { :bye => "Man" } } 

Как я могу получить это?

h1 + h2 = { :es => { :hello => "you", :bye => "Man" } }

Спасибо.

Ответы [ 4 ]

5 голосов
/ 16 апреля 2011
irb(main):001:0> h1 = {:es => {:hello => "You"}}
=> {:es=>{:hello=>"You"}}
irb(main):002:0> h2 = {:es => {:bye => "Man"}}
=> {:es=>{:bye=>"Man"}}
irb(main):003:0> h1.each_key {|x| h1[x].merge! h2[x]}
=> {:es=>{:bye=>"Man", :hello=>"You"}}
4 голосов
/ 16 апреля 2011

То, что вы хотите, это метод deep_merge. Делает именно то, что вы хотите.

ruby-1.9.2-p136 :001 > {:es => {:hello => "You" } }.deep_merge({:es => {:bye => "Man"}})
=> {:es=>{:hello=>"You", :bye=>"Man"}}

http://apidock.com/rails/ActiveSupport/CoreExtensions/Hash/DeepMerge/deep_merge

0 голосов
/ 01 мая 2011

Если вы не используете ActiveSupport, этот Proc выполнит глубокое слияние.1.8.7 и 1.9.2 совместимы.

dm = lambda {|l,r| l.merge(r) {|k,ov,nv| l[k] = ov.is_a?(Hash) ? dm[ov, nv || {}] : nv} }
dm[h1,h2]
#  => {:es=>{:hello=>"You", :bye=>"Man"}} 
0 голосов
/ 16 апреля 2011

Аналогично deep_merge ActiveSupport, но с функциональным подходом.Работает рекурсивно:

class Hash
  def inner_merge(other_hash)
    other_hash.inject(self) do |acc, (key, value)|
      if (acc_value = acc[key]) && acc_value.is_a?(Hash) && value.is_a?(Hash)
        acc.merge(key => acc_value.inner_merge(value))
      else
        acc.merge(key => value)
      end
    end       
  end
end

h1.inner_merge(h2) #=> {:es=>{:hello=>"You", :bye=>"Man"}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...