【问题标题】:Why does Hash.new({}) hide hash members? [duplicate]为什么 Hash.new({}) 隐藏哈希成员? [复制]
【发布时间】:2010-12-21 18:38:35
【问题描述】:

好的,所以我想创建一个默认值为空哈希的哈希。有点奇怪,我知道,但假设我认为它可能有用。

这就是我所做的:

>> a = Hash.new({})
=> {}
>> a[:a][:b] = 5
=> 5
>> a
=> {}
>> a[:a]
=> {:b=>5}
>> a.keys
=> []
>> a.size
=> 0
>> a[:a].size
=> 1

换句话说,当我检查哈希时,我看不到哈希成员,但我可以通过它的键访问它。

这是预期的行为吗?这是怎么回事?

顺便说一句,这是 Ruby 1.9.1,还没有尝试过早期版本。

编辑:简化示例,因为它不必是散列的散列...

【问题讨论】:

    标签: ruby hash default


    【解决方案1】:

    这是预期的行为(在所有 ruby​​ 版本中)。如果你进一步试验,你会发现无论你使用哪个键,你总是访问相同的哈希:

    >> a[:a][:b] = 1
    => 1
    >> a[:c][:d] = 2
    => 2
    >> a[:d]
    => {:b=>1, :d=>2}
    

    带有默认参数的 Hash.new 的工作方式是:如果您使用 hash[key],它会检查该键是否存在于哈希中。如果是,则返回该键的值。如果不是,则返回默认值。它不会将键添加到哈希中,并且每次都会返回相同的默认对象(不是副本)。

    为了得到你想要的,你想指定一个默认块。这样,每次您访问不在散列中的密钥时,都会执行该块。在块内,您可以创建一个新的哈希并将键设置为“指向”该哈希。像这样:

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

    【讨论】:

    • 所以基本上,他将键添加到默认值,而不是他的哈希。
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多