在Julia中使用复合类型的Set
时,push!
函数似乎将重复项添加到该集合中。阅读Julia标准文档,我认为isequal
函数将用于测试重复项。我想我误解了,所以也许有人可以帮助我。为什么push!()会将重复元素添加到Set?
举个例子,看下面的代码。特别是,我想知道为什么t2
被添加到该设置,尽管与t1
相同。
任何帮助,非常感谢。注意:在我的情况下,如果x1
和x2
的字段相同,则认为t
类型的两个变量是相同的;剩余字段的值不重要。
type t
x1::Float64
x2::Float64
b1::Bool
b2::Bool
end
isequal(tx::t, ty::t) = (tx.x1 == ty.x1) && (tx.x2 == ty.x2)
==(tx::t, ty::t) = (tx.x1 == ty.x1) && (tx.x2 == ty.x2)
t1 = t(1, 2, true, true)
t2 = t(1, 2, true, true)
tc = t1
tdc = deepcopy(t1)
[ t1 == t2 isequal(t1, t2)] # ---> [ true true ]
[ t1 == tc isequal(t1, tc)] # ---> [ true true ]
[ t1 == tdc isequal(t1, tdc)] # ---> [ true true ]
s = Set{t}()
push!(s, t1)
push!(s, t2) # adds t2 to the set although t2 and t1 are identical ...
push!(s, tc) # does not add ...
push!(s, tdc) # adds tdc although tdc and t1 are identical
是否说明[这里](http://stackoverflow.com/questions/34936593/overload-object-comparison-when-adding-to-a-set-in-julia)关于哈希回答你的问题? – DSM
谢谢你指点我的讨论。 – InkPen