julia - 我什么时候应该使用`==` vs `===` vs `isequal`
问题描述
我看到朱莉娅有 3 种不同的方式来实现平等。
==
, ===
, 和isequal
我应该使用哪个,何时使用?
解决方案
===
是内置的平等。
- 在原语上,它是值相等:如果它们具有相同的位级别表示,那么它们是相等的。
- 在可变结构上,它是引用相等:如果它们是相同的内存位置,则它们是相等的。
- 在不可变结构上,它是结构相等:如果两个结构具有相同的类型并且它们的所有字段都相等,则它们是相等的。
在所有 3 种情况下,这或多或少只是位级相等,对内存的引用是指针。(但是使不可变结构版本递归的花哨)
理想情况下,不会使用这么多,因为它不可定制。有时虽然它很好用,因为优化器可以很好地推理它,所以它可以为热循环带来更好的性能。
==
是通用的平等
它是可重载的。对于浮点数,它遵循 IEEE 规则,-0.0 == 0.0
即NaN != NaN
. 它遵循 3 个值的逻辑规则来missing == missing
生成missing
.
如果==
未定义,则回退到===
如果您已定义==
,则需要将其定义hash
为isequal
回退到 using ==
,见下文。
isequal
是字典目的的平等。
我不知道有更好的表达方式。出于和isequal
的目的被认为相同的事物。因此,您不能将两个项目作为.Dict
Set
isequal
Dict
如果您想确保NaN
s 彼此相等,并且类似地缺失彼此相等,请使用此选项。
定义时isequal
,您还必须定义hash
.
isequal(a, b)
暗示hash(a) == hash(b)
如果isequal
未定义,则回退到==
推荐阅读
- git - 如何在 Git diff 和 merge 期间忽略某些特定文件和文件夹
- php - 如何使用 Bootstrap 选择框和 PHP 准备语句将多行插入 Mysql 表?
- c++ - 尝试在 Unreal 中通过 C++ 添加视口时出现“没有重载函数 CreateWidget 的实例”错误
- python - codechef问题解决方案中python中的EOF错误
- angular - 表单字段正在验证单击切换隐藏和显示
- ios - 在 Swift 屏幕上的列中显示数组中的字符串?
- c - 有没有办法完全清除数组?
- docker - 如何使主机目录在 Ubuntu 上可共享?
- c++ - 为什么向量“emplace_back”在多线程中的行为比单线程慢得多
- python - 为什么读取一些栅格数据并将其写入新的 tiff 会花费这么多时间?