Julia 为什么推!()是否向集合中添加重复元素?

Julia 为什么推!()是否向集合中添加重复元素?,julia,Julia,在Julia中使用组合类型的集时,推函数似乎将重复项添加到集合中。在阅读Julia标准文档时,我假设将使用isequal函数来测试重复项。我想我误解了,也许有人能帮我 作为示例,请参见下面的代码。特别是,我想知道为什么将t2添加到集合中,尽管它与t1相同 非常感谢您的帮助。注:在我的情况下,如果x1和x2字段相等,则类型为t的两个变量被视为相同;其余字段的值无关紧要 type t x1::Float64 x2::Float64 b1::Bool b2::Bool end

在Julia中使用组合类型的
集时,
函数似乎将重复项添加到集合中。在阅读Julia标准文档时,我假设将使用
isequal
函数来测试重复项。我想我误解了,也许有人能帮我

作为示例,请参见下面的代码。特别是,我想知道为什么将
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

正如DSM所指出的,您只需为您的类型添加一个
哈希
方法,即:

hash(x::t, h) = hash(x.x2, hash(x.x1, h))

关于散列的解释回答了你的问题吗?谢谢你给我指点那个讨论。谢谢大家的帮助。我实际上遵循了Andrew Cooke的AutoHashEquals包提供的示例。()这是一个很好的包,它确实提到了如果您的类型不是不可变的问题,即如果您在
Dict
中更改一个对象,它将丢失(并且
Set
在Julia中实现为
Dict
)。这是您的问题,还是您可以使您的类型不可变?而且,它似乎不允许您仅在字段的子集上定义
=
散列。