我们在 Ruby 1.8.7 中做了一些工作,需要遍历和分区一个无向图,这在生产中已经奇怪地失败了。当我将失败的代码提取到最简单的组件时,我得到了这个奇怪的失败测试:
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。正确的?