我有一个传递散列的简单情况,它缺少一个字段。
我想知道在某个默认情况下添加字段的首选方法是什么?选择其中一个是否有好处以及何时?
hash['field'] = some_value
VS
hash.merge!({ 'field' => some_value })
编辑:意味着使用合并!
答案 0 :(得分:5)
首先,重要提示:success.auth.updateProfile
会返回新对象,而Hash#merge
和Hash#[]=
会改变现有对象:
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 })
的状态对你来说不是问题,那么第一种方法就可以了。