【问题标题】:Ruby Hash populated from Array.product yields unexpected behavior从 Array.product 填充的 Ruby Hash 产生意外行为
【发布时间】:2019-04-12 06:35:32
【问题描述】:

我想预先填充一个哈希,给定一个键数组和一个默认值(一个空数组)。我尝试使用Array#product 方法来做到这一点。

> hash = Hash[[:foo, :bar].product([[]])]   # => {:foo=>[], :bar=>[]}
> hash[:foo].push(:baz)                     # => {:foo=>[:baz], :bar=>[:baz]}

我不明白为什么该值会应用于哈希中的所有键。相反,如果我使用 product 的返回值并直接从中填充哈希,我会得到预期的行为。

> [:foo, :bar].product([[]])              # => [[:foo, []], [:bar, []]]
> hash = Hash[[[:foo, []], [:bar, []]]]   # => {:foo=>[], :bar=>[]}
> hash[:foo].push(:baz)                   # => {:foo=>[:baz], :bar=>[]}

我正在使用 ruby​​ 2.3.6

【问题讨论】:

    标签: ruby hash


    【解决方案1】:

    这是因为你传递给你的哈希初始化器的数组是同一个对象,所以如果你修改了这个对象,改变就会出现在它被使用的任何地方:

    > hash = Hash[[:foo, :bar].product([[]])]
     # => {:foo=>[], :bar=>[]} 
    > hash[:foo].object_id
     # => 47106586247680 
    > hash[:bar].object_id
     # => 47106586247680
    

    如果您复制粘贴 product 的输出,您将使用 2 个不同的数组,因为它们分别被实例化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2017-11-14
      • 2019-04-10
      • 1970-01-01
      • 2022-07-21
      • 2015-05-12
      • 1970-01-01
      相关资源
      最近更新 更多