好的所以我想创造一个哈希它有一个空的散列作缺省值。有点怪怪的,我知道,但是我们要说,我认为这可能是有用的。

这是我做了什么:

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

换句话说,我没有看到哈希件,当我检查的散列,但我可以访问它通过其关键。

这是预期的行为?什么在这里?

顺便说一句,这是Ruby1.9.1,没有试图以前的版本。

编辑:简化例子,因为它不必是一个哈哈希哈希...

有帮助吗?

解决方案

预计行为(在所有红宝石的版本)。如果你实验的一位另外,你看,你总是访问同一散列,不管这把钥匙,你使用:

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

该方式的散列。新与缺省参数的工作原理是:如果你这样做 hash[key] 它检查是否的关键存在的散列。如果是这样,它返回的价值,关键。如果不返回的缺省值。它不会增加的关键散和其将返回的同样的默认对象(非副本)每一时间。

得到你想要什么,你想要指定一个默认块替代。这样,区块将被执行的每次访问的关键,是不是在散。内部块你可以创建一个新的散列和组的关键"点",散列。像这样:

Hash.new { |h,k|  h[k] = {} }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top