dart - Dart 中 num 的运算符 == 定义在哪里?
问题描述
当我在我的 Android 模拟器中运行此代码时,它会打印以下内容。
void main() {
print(1 == 1.0); // true
print(identical(1, 1.0)); // false
}
我还读到默认实现==
是identical
. 这意味着运算符==
被覆盖,但是,当我去num
课堂查看它的实现时,它显示该方法是抽象的。
bool operator ==(Object other);
所以,我去看看它在double
和int
类中的实现,但在那里找不到任何东西。那么,魔法发生在哪里呢?
解决方案
这些是在本机级别实现的,Dart 声明只是这些实现的接口。这些实现可以sdk/sdk/lib/_internal/
在 Dart sdk 存储库中找到。
如果您想查看 VM 中的实现,可以转到 vm/lib 文件夹并找到包含运算符的双精度和整数实现。
我将使用整数的 VM 实现作为示例,它定义了==
运算符及其使用的方法:
@pragma("vm:recognized", "asm-intrinsic")
@pragma("vm:exact-result-type", bool)
@pragma("vm:never-inline")
bool operator ==(Object other) {
if (other is num) {
return other._equalToInteger(this);
}
return false;
}
@pragma("vm:recognized", "asm-intrinsic")
@pragma("vm:exact-result-type", bool)
bool _equalToInteger(int other) native "Integer_equalToInteger";
你可以为双打找到相同的东西,对于 dart2js 编译器可能也有类似的东西。然而,JS 编译器可能不需要特殊定义,因为==
运算符 of的定义行为num
似乎与 JS 相同。
推荐阅读
- apache - htaccess 将丢失的 bundle.*.js 版本重定向到 bundle.js 文件
- python - Geopandas 中的 Winkel Triplel 投影
- typescript - 在 TypeScript 中键入匿名对象的属性
- angular - 打字稿错误:找不到“对象”类型的不同支持对象“[对象对象]”。NgFor 仅支持绑定到 Iterables,例如 Arrays
- r - 基于一列的标准化R函数?
- pdo - PDO_firebird 无法执行带有整数参数的准备语句
- qt - Qt3D:QPickEvent 鼠标位置的 QVector3D::unproject 产生错误的 3D 坐标
- python - 如何将 groupby 与查询集成?
- python - 使用 Pyside2 QThread 线程化时,Scipy curve_fit 崩溃
- python - 按 id 查找第一个连续值组