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);