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

Lyn*_*ite 10 julia

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

=====isequal

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

Lyn*_*ite 9

=== 是内置的相等性。

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

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

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

== 是通用平等

它是可重载的。对于花车它遵循IEEE规则,即-0.0 == 0.0NaN != NaN。并遵循3个值逻辑规则来missing == missing求和missing

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

isequal 就字典而言是平等。

我不知道有什么更好的方法。isequal对于Dict和而言,被认为相同的事物Set。因此,您不能有两个项目isequal作为中的不同键Dict

如果您要确保NaNs彼此相等,并且类似地确保missings彼此相等,请使用此选项。

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

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


nor*_*ok2 7

基本上:

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

更深入的讨论在这里