首页 > 解决方案 > Dart 中 num 的运算符 == 定义在哪里?

问题描述

当我在我的 Android 模拟器中运行此代码时,它会打印以下内容。

void main() {
  print(1 == 1.0); // true
  print(identical(1, 1.0)); // false
}

我还读到默认实现==identical. 这意味着运算符==被覆盖,但是,当我去num课堂查看它的实现时,它显示该方法是抽象的。

bool operator ==(Object other);

所以,我去看看它在doubleint类中的实现,但在那里找不到任何东西。那么,魔法发生在哪里呢?

标签: dart

解决方案


这些是在本机级别实现的,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 相同。


推荐阅读