包含向量的复合类型对象的相等性测试未按预期工作。如何比较它们?

Equality testing of composite-type objects containing vectors doesn't work as expected. How to compare them?

我创建一个自定义复合类型(或结构),创建两个该类型的对象,然后测试它们是否相等:

struct mytype
    stuff::Int64
end

a = mytype(5)
b = mytype(5)

a == b
true

这符合我的预期。但是,如果我们将内容改为向量,比较 ab returns false:

struct mytype2
    stuff::Vector{Int64}
end

a = mytype2([5])
b = mytype2([5])

a == b
false

a === b
false

isequal(a, b)
false

知道这是为什么吗?在第二种情况下,当它们包含向量时,有没有办法比较 ab

内置(意味着您不能添加方法)函数 === 按地址比较可变结构,按内容比较不可变结构。 a === bfalse 因为你的不可变 ab 包含两个不同的数组地址,所以它们的内容是不同的。 a.stuff === b.stufffalse 因为数组是分开的,有自己的地址。

然后是 ==,您可以向其中添加方法的函数。默认情况下,它会回退到 ===,并且“默认情况下 == 应该递归”的问题仍然是 open issue for Julia v2 (4648)。现在,您应该为自己的类型编写自己的 == 方法。事实上,a.stuff == b.stufftrue,因为有 == 个方法专门用于 ArrayNumber。所以你的类型最简单的方法是:

Base.:(==)(a::mytype2, b::mytype2) = a.stuff == b.stuff

实际上,您的复合类型可能有更多字段,因此编写这些内容会变得乏味。问题 4648 包含生成函数 structEqual 的 post(2021 年 1 月 15 日),该函数在结构的所有字段上执行 ==,但我个人还没有尝试过。