ruby哈希中商店与合并有什么区别?

时间:2015-03-12 07:52:52

标签: ruby hash merge store

我创建一个哈希:

a = {}
=> {}

然后:

a.store(:b, {})
=> {}

a.merge!(c: {})
=> {:b=>{}, :c=>{}}

实际上有什么不同?

5 个答案:

答案 0 :(得分:4)

store是一种分配方法。

a = {}
# => {}
a.store(:b, {})
a
# => {:b=>{}}
# Here you are assigning a key :b with empty hash {}

另一个让它更清晰的例子:

a = {}
# => {}
a.store("key", "value")
a
# => {"key"=>"value"}
另一方面,

merge通过合并不同的哈希值来操纵现有的哈希值。

示例:

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的值,否则不会更改,即仅在返回时才会进行合并。

答案 1 :(得分:1)

merge!接受一个参数,即哈希合并为原始参数。 store有两个参数,这是存储的关键和值。因此,使用merge!,您可以向原始哈希添加多个键,如下所示:

a = {}
a.merge!(a: 'a', b: 'b')
a
# => {:a => "a", :b => "b"}

答案 2 :(得分:1)

store只接受一个键值对作为输入并返回存储的值。而merge!采用哈希并返回更新的哈希:

h1 = { foo: 'bar' }
h1.store(:baz, 1)          #=> 1
h1                         #=> { foo: 'bar', baz: 1 }

h2 = { foo: 'bar' }
h2.merge!(baz: 1, buz: 2)  #=> { foo: 'bar', baz: 1, buz: 2 } 
h2                         #=> { foo: 'bar', baz: 1, buz: 2 }

答案 3 :(得分:1)

  

实际上有什么不同?

我认为主要的区别是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}

答案 4 :(得分:0)

对于哈希hHash#storeHash#[]=具有相同的效果:它们都会向k=>v添加一个键值对h(如果h没有密钥k)或修改密钥k的值(如果哈希已包含密钥)。此外,他们都返回v

Hash#merge!(又名update)有两种形式。第一个与store做同样的事情,除了它为另一个哈希中的每个键值对做。第二种形式使用块来确定合并的两个哈希中存在的键的值。有关该方法的详细信息,请参阅文档。两种形式的merge!都会返回"合并"散列。

Hash#merge不是相关比较,因为它不会改变哈希值。