operator == 抽象方法

bool operator ==(
  1. 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);