operator == 抽象方法
- Object other
override
判断另一个对象是否与该函数相等。
函数对象仅与其它函数对象(满足 object is Function
的对象)相等,而不与非函数对象相等。
一些函数对象通过 ==
被认为是相等的,因为它们被认为是表示“相同函数”。
-
这是相同的对象。静态和顶层函数在用作值时是编译时常量,因此对同一函数的两次引用总是返回相同的对象,就像在声明它的作用域内对该局部函数声明两次引用一样。
void main() { assert(identical(print, print)); int add(int x, int y) => x + y; assert(identical(add, add)); }
-
是从同一对象提取的相同成员方法。反复提取(“撕掉”)同一对象的相同实例方法到函数值给出相等的函数值,但不一定是相同的。
var o = Object(); assert(o.toString == o.toString);
-
具有相同类型的相等泛型函数的实例化产生相等的结果。
T id<T>(T value) => value; assert(id<int> == id<int>);
(如果函数是常量且类型参数在编译时已知,结果也可能是相同的。)
函数字面量的不同评估不保证或要求产生相同的或相等的函数对象。例如
var functions = <Function>[];
for (var i = 0; i < 2; i++) {
functions.add((x) => x);
}
print(identical(functions[0], functions[1])); // 'true' or 'false'
print(functions[0] == functions[1]); // 'true' or 'false'
如果不同的值是相同的,它们总是相等的。
如果函数值相等,则保证对于所有参数它们的行为无法区分。
如果两个函数值的行为不同,它们永远不会相等或相同。
不要求函数表达式值的特定相等或身份的原因是允许编译器优化。如果一个函数表达式不依赖于周围的变量,则可以在多个评估之间安全地共享其实现。例如
List<int> ints = [6, 2, 5, 1, 4, 3];
ints.sort((x, y) => x - y);
print(ints);
编译器可以将闭包 (x, y) => x - y
转换为顶层函数。
实现
bool operator ==(Object other);