我們在Ruby 1.8.7中做了一些工作,它需要遍歷和分區一個無向圖,這在生產中一直都很奇怪。當我提煉失敗碼至其最起碼的組成部分,我得到這個奇怪的失敗的測試:這是Ruby中一組數組的預期行爲嗎?
it 'should be able to clear a ruby set of arrays' do
a = ["2", "b", "d"]
b = ["1", "a", "c", "e", "f"]
set = Set.new([a, b])
a.concat(b)
p "before clear: #{set.inspect}"
set.clear
p "after clear: #{set.inspect}"
set.size.should == 0
end
測試失敗,此輸出:
"before clear: #<Set: {[\"1\", \"a\", \"c\", \"e\", \"f\"], [\"2\", \"b\", \"d\", \"1\", \"a\", \"c\", \"e\", \"f\"]}>"
"after clear: #<Set: {[\"2\", \"b\", \"d\", \"1\", \"a\", \"c\", \"e\", \"f\"]}>"
expected: 0
got: 1 (using ==)
試圖從集中刪除也表現在陌生方法。我在猜測Ruby正在掛在concat()下更改數組中鍵的哈希值,但我當然應該仍然可以清除Set。對?
像你的紅寶石1.9.3p125沒有問題。 – megas
我剛剛發現這個,它回答了關於刪除的問題。但不是爲什麼明確失敗。 http://stackoverflow.com/questions/10361400/deleting-a-modified-object-from-a-set-in-a-no-op – Nello
set.clear使用hash.clear來清除它的內部散列。 Hash.clear使用hash.for_each刪除每個哈希項。所以如果有一個影響刪除的錯誤,它會影響清晰。 – philosodad