包含向量的复合类型对象的相等性测试未按预期工作。如何比较它们?
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
这符合我的预期。但是,如果我们将内容改为向量,比较 a
和 b
returns false:
struct mytype2
stuff::Vector{Int64}
end
a = mytype2([5])
b = mytype2([5])
a == b
false
a === b
false
isequal(a, b)
false
知道这是为什么吗?在第二种情况下,当它们包含向量时,有没有办法比较 a
和 b
?
内置(意味着您不能添加方法)函数 ===
按地址比较可变结构,按内容比较不可变结构。 a === b
是 false
因为你的不可变 a
和 b
包含两个不同的数组地址,所以它们的内容是不同的。 a.stuff === b.stuff
是 false
因为数组是分开的,有自己的地址。
然后是 ==
,您可以向其中添加方法的函数。默认情况下,它会回退到 ===
,并且“默认情况下 ==
应该递归”的问题仍然是 open issue for Julia v2 (4648)。现在,您应该为自己的类型编写自己的 ==
方法。事实上,a.stuff == b.stuff
是 true
,因为有 ==
个方法专门用于 Array
或 Number
。所以你的类型最简单的方法是:
Base.:(==)(a::mytype2, b::mytype2) = a.stuff == b.stuff
实际上,您的复合类型可能有更多字段,因此编写这些内容会变得乏味。问题 4648 包含生成函数 structEqual
的 post(2021 年 1 月 15 日),该函数在结构的所有字段上执行 ==
,但我个人还没有尝试过。
我创建一个自定义复合类型(或结构),创建两个该类型的对象,然后测试它们是否相等:
struct mytype
stuff::Int64
end
a = mytype(5)
b = mytype(5)
a == b
true
这符合我的预期。但是,如果我们将内容改为向量,比较 a
和 b
returns false:
struct mytype2
stuff::Vector{Int64}
end
a = mytype2([5])
b = mytype2([5])
a == b
false
a === b
false
isequal(a, b)
false
知道这是为什么吗?在第二种情况下,当它们包含向量时,有没有办法比较 a
和 b
?
内置(意味着您不能添加方法)函数 ===
按地址比较可变结构,按内容比较不可变结构。 a === b
是 false
因为你的不可变 a
和 b
包含两个不同的数组地址,所以它们的内容是不同的。 a.stuff === b.stuff
是 false
因为数组是分开的,有自己的地址。
然后是 ==
,您可以向其中添加方法的函数。默认情况下,它会回退到 ===
,并且“默认情况下 ==
应该递归”的问题仍然是 open issue for Julia v2 (4648)。现在,您应该为自己的类型编写自己的 ==
方法。事实上,a.stuff == b.stuff
是 true
,因为有 ==
个方法专门用于 Array
或 Number
。所以你的类型最简单的方法是:
Base.:(==)(a::mytype2, b::mytype2) = a.stuff == b.stuff
实际上,您的复合类型可能有更多字段,因此编写这些内容会变得乏味。问题 4648 包含生成函数 structEqual
的 post(2021 年 1 月 15 日),该函数在结构的所有字段上执行 ==
,但我个人还没有尝试过。