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)
但有没有更好的方法不涉及检查每个变量呢?
==( 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步骤。
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |