以下是Ruby错误还是完全正常?
> a = [1, 2, 3].zip([[]]*3).to_h
=> {1=>[], 2=>[], 3=>[]}
> a[1] << 2
=> [2]
> a
=> {1=>[2], 2=>[2], 3=>[2]}
我不希望所有值都被2
追加,因为我只想在密钥为2
的位置添加1
。
答案 0 :(得分:4)
预计,因为当你在zip
中创建第二个数组时,它是同一个对象:
a = [1, 2, 3].zip([[]]*3)
#=> [[1, []], [2, []], [3, []]]
a.map{|aa| aa.last.object_id }
#=> [70307853627580, 70307853627580, 70307853627580]
因此,当您尝试更新该对象时,它会反映在对象a
上:
a[0][1] << 2
#=> [2]
p a
#=> [[1, [2]], [2, [2]], [3, [2]]]
要创建具有单独对象的array,可以传递一个块。此方法可以安全地与可变对象(如哈希,字符串或其他数组)一起使用:
a = [1, 2, 3].zip( Array.new(3) { [] } )
#=> [[1, []], [2, []], [3, []]]
a[0][1] << 2
#=> [2]
p a
#=> [[1, [2]], [2, []], [3, []]]
我鼓励你阅读this article,其中讨论了Aaron Patterson的哈希问题。