我何时应该使用`==`vs`===`vs`isequal`

时间:2019-09-15 15:07:37

标签: julia

我看到朱莉娅有3种不同的方式 做平等。

=====isequal

我应该使用哪个,什么时候使用?

2 个答案:

答案 0 :(得分:9)

===是内置的等式。

  • 在基元上,它是值相等:如果它们具有相同的位级别表示,则它们相等。
  • 在可变结构上,它是引用相等:如果它们在相同的内存位置,则它们相等。
  • 在不可变的结构上,它是结构相等的:如果两个结构类型相同且它们的所有字段都相等,则两个结构相等。

在所有3种情况下,这或多或少只是位级相等,对内存的引用是指针。 (但是很想让不可变的结构版本递归)

理想情况下,不会使用太多,因为它不可自定义。 有时尽管使用它是好事,因为优化器可以很好地进行推理,因此可以提高热循环的性能。

==是通用相等性

它是可重载的。 对于Floats,它遵循IEEE规则,即-0.0 == 0.0NaN != NaN。 并且遵循missing == missing的3个值逻辑规则,得出missing

如果未定义==,则回退到===

isequal是相等于字典的目的。

我不知道一种更好的表达方式。 就isequalDict而言,Set的事物被认为是相同的。 因此,isequal中不能有两个Dict作为不同键。

如果要确保NaN彼此相等,请使用此选项, 并且类似地,丢失也彼此相等。

定义isequal时,还必须定义hashisequal(a, b)暗示hash(a) == hash(b)

如果未定义isequal,则回退到==

答案 1 :(得分:4)

基本上:

  • ==,当您对两个对象的值感兴趣时:1 == 1-> true1 == 1.0-> true
  • ===,当您要确保无法区分两个对象(包括指向不同内存的数组)时:1 === 1-> true1 === 1.0-> { {1}}和false导致A = [1, 2, 3]; B = [1, 2, 3]-> A == B,但true-> A === Bfalse-> A === A )。
  • trueisequal()相同,但是对浮点数的处理方式不同:==-> NaN == NaNfalse-> isequal(NaN, NaN)

更深入的讨论here