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

Vyu*_*wal 4 testing equality julia

我创建了一个结构体

mutable struct mystruct
    x::Float64
    i::Int
end
Run Code Online (Sandbox Code Playgroud)

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

function x_init(x::Number,i::Int)::mystruct
    x = float(x)
    Z = mystruct(x,i)
    return Z
end
Run Code Online (Sandbox Code Playgroud)

运行这个函数时我得到

julia> x_init(2,3)
mystruct(2.0, 3)
Run Code Online (Sandbox Code Playgroud)

但在测试中@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
Run Code Online (Sandbox Code Playgroud)

但有没有更好的方法不涉及检查每个变量呢?

Bat*_*aBe 7

==( Base.:==) 是可以重载的通用相等运算符。如果你不超载==,它会回落到===( Core.:===),你不能超载。===按值比较不可变对象,但按内存地址比较可变对象。尽管x_init(2,3)mystruct(2.0, 3)具有相同的值,但它们是不同的实例mutable mystruct,因此具有不同的内存地址。

此重载将x_init(2,3) == mystruct(2.0, 3)返回true

Base.:(==)(a::mystruct, b::mystruct) = a.x===b.x && a.i===b.i
Run Code Online (Sandbox Code Playgroud)

PS方法标头::mystruct中的注释x_init是不必要的。返回类型注释可能会convert在返回时添加一个步骤,但编译器可以推断 的返回类型x_init必须是mystruct并且将省略该convert步骤。