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)
puzzle の値は、削除の影響を受けません。しかし、! を含めると、できます。
どうしてこれなの?