繁体   English   中英

ruby 哈希中的存储与合并有什么区别?

[英]what is difference between store vs merge in ruby hashes?

我创建一个哈希:

a = {}
=> {}

然后:

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

和:

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

实际上有什么区别?

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的值不会改变,即合并只会发生在返回。

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 ,当提供重复键时,先前的值将被最新的值替换。

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}

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

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

对于哈希hHash#store具有与Hash#[]=相同的效果:它们都将一个键值对k=>vh (如果h没有键k )或修改键的值k (如果散列已经包含密钥)。 此外,它们都返回v

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

Hash#merge不是相关的比较,因为它不会改变散列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM