абстрактный метод operator ==
- Object other
Проверяет, равен ли этому объекту другой объект.
Объекты-функции равны только другим объектам-функциям (объектам, удовлетворяющим 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);
© 2012 the Dart project authors
Licensed under the BSD 3-Clause "New" or "Revised" License.
https://api.dart.dev/stable/2.19.6/dart-core/Function/operator_equals.html