如何在 julia 中为自定义结构创建相等性测试用例

How to create equality test case for custom structures in julia

我创建了一个结构体

mutable struct mystruct
    x::Float64
    i::Int
end

现在当我使用函数初始化它时 x_init:

function x_init(x::Number,i::Int)::mystruct
    x = float(x)
    Z = mystruct(x,i);
    return Z;
end

关于运行这个函数我得到

julia> x_init(2,3)
mystruct(2.0, 3)

但是在测试 @test x_init(2,3) == mystruct(2.0, 3) 时我得到 false

我希望得到 True

有人可以解释一下为什么我得到 false 以及我应该如何为这些函数编写测试用例。

我可以像 x_init(2,3).x == mystruct(2.0, 3).x && x_init(2,3).i == mystruct(2.0, 3).i 那样测试,但是有没有更好的方法不涉及检查每个变量。

== (Base.:==) 是可以重载的通用相等运算符。如果您不重载 ==,它会退回到 === (Core.:===),您无法重载。 ===按值比较immutableobjects,但按内存地址比较mutableobjects。尽管 x_init(2,3)mystruct(2.0, 3) 具有相同的值,但它们是 mutable mystruct 的独立实例,因此具有不同的内存地址。

这个重载将使 x_init(2,3) == mystruct(2.0, 3) return true:

Base.:(==)(a::mystruct, b::mystruct) = a.x===b.x && a.i===b.i

P.S。 x_init 方法 header 中的 ::mystruct 注释是不必要的。 Return 类型注释可能会在 return 上添加一个 convert 步骤,但编译器可以推断出 x_init 的 return 类型必须是 mystruct 并将省略 convert 步骤。