看Array#shift
删除 self 的第一个元素并返回它(将所有其他元素向下移动一个)。如果数组为空,则返回 nil。
mainhash = { 'A' => [ 0,1,2,3,4 ] , 'B' => [ 0 ,1,2 ,3 ] }
ahash = mainhash['A']
p ahash.object_id # => 8577888
p mainhash['A'].object_id # => 8577888
p indval = ahash.shift # => 0
如上所见,ahash
并mainhash['A']
引用相同的 Array 对象[ 0,1,2,3,4]
,从而改变了要从中删除的ahash#shift
原因,也导致要从中删除。0
ahash
0
mainhash['A']
说你的哈希变成如下:
mainhash
# => {"A"=>[1, 2, 3, 4], "B"=>[0, 1, 2, 3]}
所有操作都是合法的,并且发生在我上面给出的链接中。
如何避免影响主哈希
正如@Marek Lipka 所说:
你应该使用 dup 方法: ahash = mainhash['A'].dup。
mainhash = { 'A' => [ 0,1,2,3,4 ] , 'B' => [ 0 ,1,2 ,3 ] }
ahash = mainhash['A'].dup
ahash.object_id # => 8577516
mainhash['A'].object_id # => 8577600
indval = ahash.shift # => 0
ahash # => [1, 2, 3, 4]
mainhash['A'] # => [0, 1, 2, 3, 4]