我认为 Array#delete 删除了数组中对象的所有副本,但是在我正在编写的这个程序中发生了一些奇怪的(对我来说莫名其妙的)事情。仅当我在删除函数的末尾包含一个爆炸时,删除似乎才有效,即使这似乎没有被定义。
这是有问题的功能:
def propagate
@puzzle.each do |sqr, values|
if values.length == 1
@neighbors[sqr].each do |neighbor|
@puzzle[neighbor].delete!(values)
end
end
end
end
@puzzle 是一个以字符串为键和值的哈希,格式如下:@puzzle["A1"] = "123456789"
@neighbors 是一个以字符串为键、以字符串数组为值的散列:
@neighbors["A1"] = ["A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "B1", "C1", "D1", "E1", "F1", "G1", "H1", "I1", "B2", "B3", "C2", "C3"]
当我运行这样的代码时: @puzzle[neighbor].delete(values)
谜题中的值不受删除的影响。但是当我包括!有用。
为什么是这样?