控制台输出:
2.1.3 :011 > b = Hash.new( Hash.new([]) )
=> {}
2.1.3 :012 > b[:a][:b] << 'hello'
=> ["hello"]
2.1.3 :013 > b
=> {}
2.1.3 :014 > b.size
=> 0
2.1.3 :015 > b.keys
=> []
2.1.3 :016 > b[:a][:b]
=> ["hello"]
为什么我可以访问b[:a][:b]
中存储的值,b
的大小为0且没有密钥?
答案 0 :(得分:0)
如果指定了
obj
,则此单个对象将用于所有默认值。
现在Hash.new([])
持有默认Array
对象。现在b[:a][:b] << 'hello'
正在输入,"hello"
为默认Array
。当键没有时,默认值将被返回不存在于Hash
。
不要认为您使用此b[:a][:b] << 'hello' line.
b[:a]
正在提供默认Hash
对象,即Hash.new([])
。现在,在Hash
对象上,您使用密钥Hash#[]
呼叫:b
,但由于:b
是不存在的密钥,因此它提供默认值{{1 } 对象。
这就是为什么Array
,b
和b.size
都证明b.keys
为空。
最后。
为什么我可以访问存储在b [:a] [:b]中的值,但b的大小为0且没有键?
因为,您已将值Hash
添加到默认"Hello"
,如上所述。当您使用第Array
行时,该值即将到来。