【问题标题】:what is difference between store vs merge in ruby hashes?ruby 哈希中的 store 和 merge 有什么区别?
【发布时间】:2015-05-14 07:03:11
【问题描述】:

我创建一个哈希:

a = {}
=> {}

然后:

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

和:

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

实际上有什么区别?

【问题讨论】:

  • store 接受 k 和 v,merge 接受另一个哈希。
  • 顺便说一句,a.store(:b, {}) 等价于a[:b] = {}

标签: ruby hash merge store


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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 }
      

      【讨论】:

      • 两个示例看起来几乎相同。也许您应该将哈希与多个键值对合并。
      【解决方案4】:

      实际上有什么区别?

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-09-12
          • 2016-03-20
          • 2023-03-04
          • 2011-08-31
          • 2012-04-03
          • 2016-01-24
          • 1970-01-01
          • 2010-10-02
          • 1970-01-01
          相关资源
          最近更新 更多