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

问题描述 投票:5回答:2

我有以下代码:


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

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

julia
2个回答
4
投票
原因是默认情况下==降为===。现在===的工作方式是(引用文档):

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

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


2
投票
BogumiłKamiński是正确的,但您可能会

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.