如何在 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
步骤。
我创建了一个结构体
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
步骤。