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