Ruby hash bug,异常或正常?

时间:2016-09-28 03:47:29

标签: arrays ruby hash

以下是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

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的哈希问题。