【问题标题】:Does changing a hash inside a hash not update the first one?更改散列中的散列不会更新第一个散列吗?
【发布时间】:2019-03-18 03:24:23
【问题描述】:

在这个例子中:

2.2.2 :001 > a = Hash.new(Hash.new)
 => {} 
2.2.2 :002 > a[1][2] = 3
 => 3 
2.2.2 :003 > a
 => {} 
2.2.2 :004 > a[1][2]
 => 3 

在命令003 之后,我期待{1=>{2=>3}}。为什么不是这样,我怎样才能做到这一点?

我尝试重新散列,但这并没有解决我的问题。

【问题讨论】:

  • Hash#inspect(第 3 行)返回的字符串不包含默认哈希值。使用a.default

标签: ruby hash


【解决方案1】:

哈希的默认值是当您尝试访问不存在的键时返回的值。访问这样的密钥实际上不会将其添加到哈希中,因为您需要使用default_proc

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

请注意,默认值d 是单独声明的,以便共享。如果你想区分默认哈希,那么你会说:

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

fine manual 可能在这里有用:

new → new_hash
new(obj) → new_hash
new {|hash, key|块 } → new_hash

返回一个新的空哈希。如果此哈希随后被不对应于哈希条目的键访问,则返回的值取决于用于创建哈希的 new 的样式。在第一种形式中,访问返回nil。如果指定了 obj,则该单个对象将用于所有 默认值。如果指定了一个块,它将使用哈希对象和键调用,并且应该返回默认值。如果需要,将值存储在哈希中是块的责任。

最后一句话很重要:如果您希望将密钥添加到哈希中,您必须确保自己发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2013-07-08
    • 2011-07-03
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多