我有一个名为 Dyad 的自定义类型,它由两个变量 src 和 dst 组成。我已经为dyads重新定义了等号,例如
Dyad(1,2) == Dyad(2,1)
>true
但是,如果我定义以下Dyad向量
d = [Dyad(1,2), Dyad(2,1)]
unique(d) == d
>true
我是否需要重新定义我的平等,以便 unique()明白这一点?
P.S这是我定义我的平等的方式:
==(x::Dyad, y::Dyad) = (x.src == y.src && x.dst == y.dst) || (x.src == y.dst && x.dst == y.src)
答案 0 :(得分:3)
为hash
定义Dyad
可能更简单:
hash(x::Dyad, h::UInt) = hash(minmax(x.src, x.dst), h)
得到你想要的。通过这种方式,您可以确保在过程中使用hash
测试相等性的所有函数都能正常工作。
编辑:minmax
将优于extrema
。
答案 1 :(得分:2)
我不确定我能解释得多好但我会试一试。
基本上unique
迭代你给它的所有值,并测试value in seen_values
(如果不是,则将值附加到要返回的值列表中)。但是,此处的seen_values
类型为Set
,而in(x, s::Set)
的定义与in(x, a::AbstractArray)
不同。在Set
in
版==
版中,in
运算符不用于定义相等性。为了解决这个问题,我们可以为Dyad
类型定义Base
的专用版本。请参阅下面的代码(它还将显示type Dyad
src::Int
dst::Int
end
import Base.==
==(x::Dyad, y::Dyad) = (x.src == y.src && x.dst == y.dst) || (x.src == y.dst && x.dst == y.src)
d = [Dyad(1,2), Dyad(2,1)]
# @show unique(d) # hmmm... if you uncomment this line it won't work
# (I guess because unique will be already compiled...)
@show in(d[1], [d[2]])
@which in(d[1], [d[2]])
@show in(d[1], Set([d[2]]))
@which in(d[1], Set([d[2]]))
import Base.in
in(x::Dyad, s::Set) = any(y->y==x, s)
@show unique(d) ## Yay! it works
源代码中的相关行。)
pairlist(X,Y)