我创建一个哈希:
a = {}
=> {}
然后:
a.store(:b, {})
=> {}
和:
a.merge!(c: {})
=> {:b=>{}, :c=>{}}
实际上有什么区别?
存储是一种赋值方法。
a = {}
# => {}
a.store(:b, {})
a
# => {:b=>{}}
# Here you are assigning a key :b with empty hash {}
另一个更清楚的例子:
a = {}
# => {}
a.store("key", "value")
a
# => {"key"=>"value"}
另一方面,合并通过合并不同的哈希来操纵您现有的哈希。
例:
a = {}
# => {}
a.merge({"key" => "value"})
# => {"key"=>"value"}
a
# => {} # original value still unchanged
a.merge!({"key" => "value"})
# => {"key"=>"value"}
a
# => {"key"=>"value"} # original value updated
但是,除非您使用 merge!
a
的值将不会更改,即合并只会在返回时发生。
实际上有什么区别?
我认为主要区别在于merge!
可以让您决定在提供重复键时保留哪个值,因为它也需要一个块。
另一方面,当您使用 store
时,当提供重复键时,以前的值将被最新值替换。
store
h1 = { "a" => 100, "b" => 200 }
h1.store("b", 254)
#=> {"a"=>100, "b"=>254}
merge!
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge!(h2) { |key, v1, v2| v1 }
#=> {"a"=>100, "b"=>200, "c"=>300}
store
只接受一个键/值元组作为输入并返回存储的值。
h1 = { foo: 'bar' }
h1.store(:baz, 1) #=> 1
h1 #=> { foo: 'bar', baz: 1 }
而merge!
接受哈希作为输入并返回更新的哈希:
h2 = { foo: 'bar' }
h2.merge!(baz: 1, buz: 2) #=> { foo: 'bar', baz: 1, buz: 2 }
h2 #=> { foo: 'bar', baz: 1, buz: 2 }
merge!
接受一个参数,即哈希合并到原始参数中。 store
接受两个参数,即要存储的键和值。因此,使用 merge!
,您可以向原始哈希添加多个键,如下所示:
a = {}
a.merge!(a: 'a', b: 'b')
a
# => {:a => "a", :b => "b"}
对于哈希h
,Hash#store 与 Hash#[]= 具有相同的效果:它们要么添加一个键值对k=>v
h
(如果h
没有键k
),要么修改键k
的值(如果哈希已经包含键)。此外,他们都返回v
.
哈希#合并!(又名update
)有两种形式。第一个与store
做同样的事情,除了它对另一个哈希中的每个键值对这样做。第二种形式使用块来确定合并的两个哈希中存在的键的值。有关该方法形式的详细信息,请参阅文档。两种形式的merge!
都返回"合并"哈希。
#合并不是一个相关的比较,因为它不会改变哈希。