我看到朱莉娅有3种不同的方式 做平等。
==
,===
和isequal
我应该使用哪个,什么时候使用?
答案 0 :(得分:9)
===
是内置的等式。在所有3种情况下,这或多或少只是位级相等,对内存的引用是指针。 (但是很想让不可变的结构版本递归)
理想情况下,不会使用太多,因为它不可自定义。 有时尽管使用它是好事,因为优化器可以很好地进行推理,因此可以提高热循环的性能。
==
是通用相等性它是可重载的。
对于Floats,它遵循IEEE规则,即-0.0 == 0.0
,NaN != NaN
。
并且遵循missing == missing
的3个值逻辑规则,得出missing
。
如果未定义==
,则回退到===
isequal
是相等于字典的目的。我不知道一种更好的表达方式。
就isequal
和Dict
而言,Set
的事物被认为是相同的。
因此,isequal
中不能有两个Dict
作为不同键。
如果要确保NaN
彼此相等,请使用此选项,
并且类似地,丢失也彼此相等。
定义isequal
时,还必须定义hash
。
isequal(a, b)
暗示hash(a) == hash(b)
如果未定义isequal
,则回退到==
答案 1 :(得分:4)
基本上:
==
,当您对两个对象的值感兴趣时:1 == 1
-> true
和1 == 1.0
-> true
===
,当您要确保无法区分两个对象(包括指向不同内存的数组)时:1 === 1
-> true
但1 === 1.0
-> { {1}}和false
导致A = [1, 2, 3]; B = [1, 2, 3]
-> A == B
,但true
-> A === B
(false
-> A === A
)。true
与isequal()
相同,但是对浮点数的处理方式不同:==
-> NaN == NaN
但false
-> isequal(NaN, NaN)
。更深入的讨论here。