红宝石哈希中存储与合并之间的区别是什么?

问题描述 投票:3回答:5

我创建一个哈希:

a = {}
=> {}

然后:

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

和:

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

实际上有什么区别?

ruby hash merge store
5个回答
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的值不会被更改,即合并只会发生以返回。


2
投票

store仅采用一个键/值元组作为输入,并返回存储的值。

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

Where merge!接受哈希作为输入并返回更新的哈希:

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

1
投票

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

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

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}

0
投票

对于散列hHash#storeHash#[]=的作用相同:它们都向k=>v添加一个键-值对h(如果h没有键k )或修改键k的值(如果散列中已经包含键)。同样,它们都返回v

Hash#merge!(aka update)有两种形式。第一个功能与store的功能相同,不同之处在于它对另一个哈希中的每个键值对都执行此操作。第二种形式使用一个块来确定合并的两个哈希中存在的键的值。请参阅文档以获取有关该方法形式的详细信息。两种形式的merge!都返回“合并的”哈希。

[Hash#merge是不相关的比较,因为它不会使哈希值发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.