为啥结构和可变结构具有不同的默认相等运算符?

Posted

技术标签:

【中文标题】为啥结构和可变结构具有不同的默认相等运算符?【英文标题】:Why do structs and a mutable structs have different default equality operators?为什么结构和可变结构具有不同的默认相等运算符? 【发布时间】:2019-12-10 19:40:54 【问题描述】:

我有以下代码:


julia> struct Point
           x
           y
       end

julia> Point(1,2) == Point(1,2)
true

julia> mutable struct Points
           x
           y
       end

julia> Points(1,2) == Points(1,2)
false

为什么两个对象在普通结构体时相等,而在可变结构体时不相等?

【问题讨论】:

考虑更新问题的标题应该更窄,因为您特别询问 == 在默认情况下如何用于可变和不可变结构。 我听到你在说什么,但是 imo,我不知道你的建议真的是我想问的问题,所以在同样情况下的其他人可能找不到这个问题他们也不知道要问的正确问题 我认为可以将原始标题中的问题也作为一个单独的问题提出,然后例如使用病毒在我的答案的评论中给出的答案。 【参考方案1】:

原因是默认情况下== 回退到===。现在=== 的工作方式是(引用文档):

首先比较 x 和 y 的类型。如果它们是相同的, 可变对象通过内存中的地址和不可变对象(例如数字)进行比较 按位级别的内容进行比较。

因此,对于不可变的Point,将执行内容比较(在您的情况下是相同的)。虽然Points 是可变的,但传递对象的内存地址会进行比较,并且它们是不同的,因为您创建了两个不同的对象。

【讨论】:

我觉得这篇博文对这个话题也很有用(尽管语法已经改变):julialang.org/blog/2013/03/efficient-aggregates【参考方案2】:

Bogumił Kamiński 是正确的,但您可能为什么在可变类型和不可变类型之间存在=== 定义的差异。原因是您的不可变结构 Point 实际上是无法区分的。由于它们无法更改,它们的值将始终相同,因此它们也可能是同一个对象的两个名称。因此,在语言中,它们仅由它们的值来定义。

相比之下,对于 mutabke 结构,至少有两种方法可以区分它们。首先,由于可变结构通常不能被堆栈分配,它们有一个内存位置,您可以比较两个可变结构的内存位置,看看它们是不同的。其次,您可以简单地改变其中的一个,然后看到只有一个对象发生变化,而另一个没有。

所以,=== 的定义不同的原因是两个相同的可变结构可以区分,而两个不可变结构不能。

【讨论】:

以上是关于为啥结构和可变结构具有不同的默认相等运算符?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之集合

为啥赋值运算符和相等运算符之间没有 1:1 的关系?

Java简介2.0

比较遗传算法GA和遗传编程GP有什么不同?

为啥 = 运算符在没有定义的结构上工作?

20172314 2017-2018-2 《程序设计与数据结构》第5周学习总结