我有以下代码:

$ze = Hash.new( Hash.new(2) )

$ze['test'] = {0=> 'a', 1=>'b', 3 => 'c'}

$ze[5][0] = 'one'
$ze[5][1] = "two"

puts $ze
puts $ze[5]

这是输出:
{"test"=>{0=>"a", 1=>"b", 3=>"c"}}
{0=>"one", 1=>"two"}

为什么不输出:
{"test"=>{0=>"a", 1=>"b", 3=>"c"}, 5=>{0=>"one", 1=>"two"}}
{0=>"one", 1=>"two"}

最佳答案

使用$ze[5][0] = xxx,您首先要调用[]的getter $ze,然后调用[]=的二传手$ze[5]。参见Hash's API

如果$ze不包含 key ,它将返回您使用Hash.new(2)初始化的默认值。

$ze[5][0] = 'one'
# in detail
$ze[5] # this key does not exist,
       # this will then return you default hash.
default_hash[0] = 'one'

$ze[5][1] = 'two'
# the same here
default_hash[1] = 'two'

您没有向$ze添加任何内容,而是向其默认哈希添加了键/值对。
这就是为什么您也可以这样做。您将得到与$ze[5]相同的结果。
puts $ze[:do_not_exist]
# => {0=>"one", 1=>"two"}

10-05 23:04