【问题标题】:Creating a Hash with values as arrays and default value as empty array [duplicate]创建一个哈希值作为数组和默认值作为空数组[重复]
【发布时间】:2015-08-02 18:03:12
【问题描述】:

我想在 Ruby 中创建一个默认值为空数组的哈希

所以,我编码了

x = Hash.new([])

但是,当我尝试将值推入其中时

x[0].push(99)

所有键都被99 推入该数组。我该如何解决这个问题?

【问题讨论】:

  • Hash.new { [] } 是你想要的。
  • @CarySwoveland 这将返回一个新数组而不将其存储在哈希中
  • 如果您通过|=(例如x[0] |= [99])添加值,则可以使用x = Hash.new { [] },因为这将创建一个新数组并将其分配给x[0]。我认为最好在下面的答案中明确说明。

标签: ruby


【解决方案1】:
h = Hash.new{|h,k| h[k] = [] }

h[0].push(99)

这将导致{0=>[99]}


当使用Hash.new([]) 时,使用单个对象作为默认值(即当哈希键h[0] 不返回任何内容时返回的值),在这种情况下是一个数组。

所以当我们说h[0].push(99) 时,它会将99 推入该数组,但不会分配h[0] 任何东西。所以如果你输出h,你仍然会看到一个空的哈希{},而默认的对象是[99]。


然而,当提供一个块时,即Hash.new{|h,k| h[k] = [] },每次需要默认值时都会创建一个新对象并分配给h[k]。

h[0].push(99) 将分配h[0] = [] 并将值推送到这个新数组中。

【讨论】:

    【解决方案2】:

    拉克希米是对的。当您使用 Hash.new([]) 创建哈希时,您创建了 一个 数组对象。

    因此,对于 Hash 中的每个 缺失键,都会返回 same 数组。

    这就是为什么如果共享数组被编辑,更改会反映在所有缺失的键上。

    使用:

    Hash.new { |h, k| h[k] = [] }
    

    为 Hash 中的每个缺失键创建并分配一个 new 数组,使其成为唯一的对象。

    【讨论】:

    • Hash.new(Array.new)和Hash.new{Array.new}有什么区别?
    • @vildhjarta Hash.new(Array.new) 在将新数组传递给 Hash 构造函数之前只创建一次数组,因此所有丢失的对象都共享同一个数组。 Hash.new {Array.new} 每次调用块时都会创建一个新数组 ({Array.new}),它会为每个丢失的对象生成一个新数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多