Spec-Zone.ru › Dart 2

dart:core

абстрактный метод 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);

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API