首页 > 解决方案 > 我什么时候应该使用`==` vs `===` vs `isequal`

问题描述

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

==, ===, 和isequal

我应该使用哪个,何时使用?

标签: julia

解决方案


===是内置的平等。

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

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

理想情况下,不会使用这么多,因为它不可定制。有时虽然它很好用,因为优化器可以很好地推理它,所以它可以为热循环带来更好的性能。

==是通用的平等

它是可重载的。对于浮点数,它遵循 IEEE 规则,-0.0 == 0.0NaN != NaN. 它遵循 3 个值的逻辑规则来missing == missing生成missing.

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

如果您已定义==,则需要将其定义hashisequal回退到 using ==,见下文。

isequal是字典目的的平等。

我不知道有更好的表达方式。出于和isequal的目的被认为相同的事物。因此,您不能将两个项目作为.DictSetisequalDict

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

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

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


推荐阅读