2014-04-09 36 views
0

假設我有兩個散列設置。 'defaults'散列在啓動時被初始化,'settings'散列在數據庫中被保留。並非所有的設置都有默認設置,並且並非所有的設置都被保留在第一次啓動時,意味着這些散列可能有不同的鍵。我需要製作3散列「all_settings」,這將有這兩個的所有鍵值,設置鍵值覆蓋默認的,如果兩者都存在:使用邏輯謂詞從兩個不同大小的散列做散列

all_settings[key] = settings[key] || defaults[key] 

我已經成功做到這一點的

all_settings = {} 
defaults.each{|name, value| all_settings[name] = settings[name] || defaults[name]} 
settings.each{|name, value| all_settings[name] = settings[name] || defaults[name]} 

但我覺得它有點笨。有沒有辦法使用更短和更精確的語法來做同樣的事情?

+0

@Zach有你的問題的答案,其中'設置'確定兩個哈希共享密鑰時的值。更一般地說(但不是爲了你的問題),'merge'可以採取'h1.merge(h2){| k,v1,v2 | ''。如果'h1'和'h2'都有鍵'k','v1 = h1 [k]'和'v2 = h2 [k]',塊返回的值將成爲鍵'k'的值在合併散列。 –

回答

4

你正在尋找的方法是merge

all_settings = defaults.merge(settings) 

...將返回包含所有鍵值對從defaults一個新的哈希,所有的鍵值對從settings 。如果任何密鑰被複制,它將使用從settings的值。