Types 在Julia中添加到集合时重载对象比较?
有没有办法重载Types 在Julia中添加到集合时重载对象比较?,types,julia,Types,Julia,有没有办法重载Base.Set在Julia中进行对象比较的方式 我尝试过重载isequal和==,但我的对象在应该相同时仍被标记为不同 例如 给予 有一个用于复合类型比较的有用包: 然而,正如@Gnimuc-K指出的那样,“当可变类型用作不可变记录时,此宏仅对可变类型有用。”ASet是一种Dict,其值类型为Void: 其中:index=hashindex(key,sz) Julia使用hash()函数执行哈希任务: 散列(x[,h]) 计算整数散列码,使其等于(x,y) 暗示散列(x)=散列(
Base.Set在Julia中进行对象比较的方式
我尝试过重载isequal
和==
,但我的对象在应该相同时仍被标记为不同
例如
给予
有一个用于复合类型比较的有用包:
然而,正如@Gnimuc-K指出的那样,“当可变类型用作不可变记录时,此宏仅对可变类型有用。”ASet
是一种Dict
,其值类型为Void
:
其中:index=hashindex(key,sz)
Julia使用hash()
函数执行哈希任务:
散列(x[,h])
计算整数散列码,使其等于(x,y)
暗示散列(x)=散列(y)。可选的第二个参数h是散列
要与结果混合的代码。新类型应该实现
2参数形式,通常通过调用2参数散列方法
递归地将内容的散列相互混合
(和h)。通常,实现哈希的任何类型都应该
实现它自己的==(因此是相等的)以保证属性
如上所述
因此,通过这些准备工作,显然覆盖Base.==
,不是完成任务的正确且完整的方法,但是
我们需要重写hash()
函数以返回相同的hashindex
和
代替Base.==
覆盖Base.isequal就足够了
代码:
type Test
x
y
end
Base.hash(a::Test, h::UInt) = hash(a.y, hash(a.x, hash(:Test, h)))
Base.isequal(a::Test, b::Test) = Base.isequal(hash(a), hash(b))
Set([Test(2,3), Test(2,3)])
关键是,尽管Test(2,3)==Test(2,3)#=>false
它仍能按预期工作。最好在答案中加上:“当可变类型用作不可变记录时,此宏仅对它们有用。”必须同时重载散列
和isequal
,这很烦人,我希望它们能改变这一点:
Set([Test(2,3),Test(2,3)])
using AutoHashEquals
@auto_hash_equals type Test
x
y
end
X = Test(2, 3)
Y = Test(2, 3)
Z = Test(1, 3)
X == Y # = true
X == Z # = false
Set([X, Y, Z]) # = Set([Test(2,3),Test(1,3)])
type Set{T} <: AbstractSet{T}
dict::Dict{T,Void}
Set() = new(Dict{T,Void}())
Set(itr) = union!(new(Dict{T,Void}()), itr)
end
if !isslotmissing(h,index) && isequal(key,keys[index])
return index
end
type Test
x
y
end
Base.hash(a::Test, h::UInt) = hash(a.y, hash(a.x, hash(:Test, h)))
Base.isequal(a::Test, b::Test) = Base.isequal(hash(a), hash(b))
Set([Test(2,3), Test(2,3)])