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

时间:2019-12-10 19:40:54

标签: julia

我有以下代码:


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

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

2 个答案:

答案 0 :(得分:3)

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

  

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

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

答案 1 :(得分:2)

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

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

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