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指出的那样,“当可变类型用作不可变记录时,此宏仅对可变类型有用。”A
Set
是一种
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)])