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

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

提问人:Vance 提问时间:9/28/2021 更新时间:9/28/2021 访问量:128

问:

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

struct mytype
    stuff::Int64
end

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

a == b
true

这和我预期的那样有效。但是,如果我们将内容设置为向量,则比较并返回 false:ab

struct mytype2
    stuff::Vector{Int64}
end

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

a == b
false

a === b
false

isequal(a, b)
false

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

Julia Equality 复合类型

评论

1赞 Sundar R 9/28/2021
答案与要 stackoverflow.com/q/59274263/8127 的答案几乎相同(尽管问题不同:这里的结构本身是不可变的,但其内容是可变的)。Vector

答:

3赞 BatWannaBe 9/28/2021 #1

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

然后是 ,一个可以添加方法的函数。默认情况下,它回退到 ,并且“默认情况下应该是递归的”问题仍然是 Julia v2 (4648) 的未决问题。现在,您应该为自己的类型编写自己的方法。事实上,这是因为有专门针对 s 的方法。因此,对于您的类型,最简单的方法是:=========a.stuff == b.stufftrue==ArrayNumber

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

在实践中,你的复合类型可能有更多的字段,所以写这些东西会变得乏味。问题 4648 包括一篇帖子(2021 年 1 月 15 日),该帖子介绍了一个生成的函数,该函数适用于结构的所有字段,尽管我个人还没有尝试过。structEqual==