2014-04-09 86 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的值。