【发布时间】:2015-05-11 19:59:28
【问题描述】:
在 Dart 中使用运算符重载时,操作函数是在编译时解析,还是在运行时解析,或者其他什么?
在什么情况下 vm 或 dart2js 能够绕过类似这样的东西:
function add(left, right) {
if (isPrimitive(left) && isPrimitive(right)) {
return left + right;
} else if (left.hasOverload("+")) {
return left.plus(right);
} else if (left.hasReverseOverload("+")) {
return right.plus(left);
} else {
throw new Error("Cannot add objects");
}
}
在 dart 中,编译时的 a + b 可能会更改为 add(a,b)。这将是运行时检查,出于显而易见的原因,我担心它的性能。所以基本上,什么时候在 Dart 中使用运行时检查?
【问题讨论】:
-
我不确定这在 Dart 中是否容易区分,因为 Dart 在运行时编译。据我所知,如果它们被频繁调用并且它有足够的知识,Dart 会优化这些东西。 Dart 在运行时丢弃类型注释,这使得这更难分辨。
-
我想我应该改写这个问题,因为飞镖可能会在中间做点什么。
标签: dart operator-overloading metaprogramming vm-implementation dart2js