我有以下代码:
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
为什么两个对象在普通结构中相等,而在可变结构中为何不相等?
答案 0 :(得分:3)
原因是默认情况下==
会退回到===
。现在===
的工作方式是(引用文档):
首先比较x和y的类型。如果相同的话 可变对象通过内存中的地址与不可变对象(例如数字)进行比较 将按位级别的内容进行比较。
因此对于不变的Point
,执行内容比较(在您的情况下相同)。 Points
是可变的,因此比较传递的对象的内存地址,并且由于您创建了两个不同的对象,它们是不同的。
答案 1 :(得分:2)
BogumiłKamiński是正确的,但您可能会为什么在可变类型和不可变类型之间存在===
的定义差异。原因是您的不变结构Point
实际上是无法区分的。由于它们不能更改,因此它们的值将始终相同,因此它们也可能是同一对象的两个名称。因此,在语言中,它们仅由其值定义。
相反,对于mutabke结构,至少有两种方法可以区分它们。首先,由于可变结构通常无法通过堆栈分配,因此它们具有一个内存位置,您可以比较两个可变结构的内存位置,看看它们是否不同。其次,您可以简单地突变其中一个,然后看到只有一个对象发生了变化,而另一对象没有发生变化。
===
定义不同的原因是,可以区分两个相同的可变结构,但是不能区分两个不可变的结构。