今天我尝试了以下代码片段,我不明白为什么我们之间会得到不同的结果。据我所知,他们是一样的。
一个使用默认值off Hash
,另一个代码段会在访问密钥之前为密钥创建一个空数组。
任何了解发生了什么的人? :)
# Hash default if the key doesn't have a value set is an empty Array
a = Hash.new([])
a[:key] << 2 # => [2]
p a # => {} nil
p a[:key] # => [2]
p a.keys # => []
p a.values # => []
# Explicitly add an array for all nodes before creating
b = Hash.new
b[:key] ||= []
b[:key] << 2 # => [2]
p b # => {:key=>[2]}
p b.keys # => [:key]
Ruby版本1.8.7
答案 0 :(得分:5)
也许这会有所帮助:
a = Hash.new { |hash, key| hash[key] = [] }
a[:key] << 2 # => [2]
a[:key] # => [2]
p a # => {:key=>[2]}
答案 1 :(得分:4)
当您执行a[:key] << 2
时,您将该空数组默认值滑出并添加2(修改实际数组,而不是引用),而不让哈希对象a
知道您已更改任何东西。您修改了a
正在使用的对象作为默认值,因此您也会看到这一点:
p a[:wat] #=> [2]
p a[:anything] #=> [2]
在第二个示例中,您创建了一个新数组,并使用b[:key]=
告诉b
它在该键下具有值。
如果你想要两全其美,试试这个:
c = Hash.new([])
c[:key] += [2]
这将访问c[:key]
并使用+
创建一个新数组并重新分配。