哈希合并与分配

时间:2017-06-10 11:26:59

标签: ruby hash idiomatic

我有一个传递散列的简单情况,它缺少一个字段。

我想知道在某个默认情况下添加字段的首选方法是什么?选择其中一个是否有好处以及何时?

hash['field'] = some_value

VS

hash.merge!({ 'field' => some_value })

编辑:意味着使用合并!

3 个答案:

答案 0 :(得分:5)

首先,重要提示:success.auth.updateProfile会返回对象,而Hash#mergeHash#[]=会改变现有对象:

Hash#merge!

当你有两个需要合并在一起的现有哈希时,使用hash = {a: :b} hash.merge(c: :d) # => {a: :b, c: :d} puts hash # => {a: :b} (!!!) hash[:c] = :d puts hash # => {a: :b, c: :d} hash.merge!(e: :f) puts hash # => {a: :b, c: :d, e: :f} 而不是Hash#merge!的主要用例是(顾名思义!):

Hash#[]=

这比在hash1 = {a: :b, c: :d} hash2 = {e: :f, g: :h} hash1.merge!(hash2) puts hash1 # => {a: :b, c: :d, e: :f, g: :h} 中循环遍历所有值的更冗长的方法相当,但更方便:

hash2

答案 1 :(得分:1)

  

我想知道哪个是添加默认

字段的首选方法

我将默认值存储在一个额外的哈希值中(即使它只是一个值),所以我可以在以后轻松添加其他值:

defaults = { foo: 1, bar: 2 }

然后,我将以保留给定值的方式合并默认值,方法是创建一个新的哈希:

hash = { foo: 100, baz: 300 }
hash = defaults.merge(hash)
#=> {:foo=>100, :bar=>2, :baz=>300}

或通过原位更改哈希:

hash = { foo: 100, baz: 300 }
hash.merge!(defaults) { |key, given_value, default_value| given_value }
#=> {:foo=>100, :baz=>300, :bar=>2}

答案 2 :(得分:0)

第一种方法改变了哈希本身(没有创建新对象)

第二个使用原始hash{ 'field' => some_value }中的键创建新的Hash类实例(比较object_id的{​​{1}}和hash的结果 - 他们会有所不同)

选哪一个? 这取决于 - 如果改变hash.merge({ 'field' => some_value })的状态对你来说不是问题,那么第一种方法就可以了。