Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

try {

this.foreach(function(v) {
if(!that.contains(v)) throw false; });

return true; // Все элементы совпали: множества равны.

} catch (х) {

if (х === false) return false; // Элемент в this отсутствует в that,

throw x; // Для других исключений: возбудить повторно.

}

}:

Иногда бывает полезно реализовать операции сравнения, чтобы выяснить порядок следования объектов. Так, для некоторых классов вполне можно сказать, что один экземпляр «меньше» или «больше» другого. Например, объекты Range можно упорядочивать, опираясь на значение нижней границы. Типы-перечисления можно было бы упорядочивать в алфавитном порядке по именам или в числовом порядке - по значениям, присваиваемым именам (предполагается, что именам присваиваются числовые значения). С другой стороны, объекты класса Set не имеют какого-то естественного порядка следования.

При попытке сравнения объектов с помощью операторов отношения, таких как

<
и
<=
, интерпретатор сначала вызовет методы
valueOf
объектов и, если методы вернут значения простых типов, сравнит эти значения. Типы-перечисления, возвращаемые методом
enumeration
из примера 9.7, имеют метод
valueOf
и могут сравниваться с помощью операторов отношения. Однако большинство классов не имеют метода
valueOf
. Чтобы сравнивать объекты этих типов для выяснения порядка их следования по вашему выбору, необходимо (опять же, следуя соглашениям, принятым в языке программирования Java) реализовать метод с именем
compareTo.

Метод

compareTo
должен принимать единственный аргумент и сравнивать его с объектом, метод которого был вызван. Если объект
this
меньше, чем объект, представленный аргументом, метод
compareTo
должен возвращать значение меньше нуля. Если объект
this
больше, чем объект, представленный аргументом, метод должен возвращать значение больше нуля. И если оба объекта равны, метод должен возвращать ноль. Эти соглашения о возвращаемом значении весьма важны, потому что позволяют выполнять замену операторов отношения следующими выражениями:

Класс

Card
в примере 9.8 определяет подобный метод
compareTo,
и мы можем написать похожий метод для класса
Range
, чтобы упорядочивать диапазоны по их нижним границам:

Range.prototype.compareTo = function(that) {

return this.from - that.from;

};

Обратите внимание, что вычитание, выполняемое этим методом, возвращает значение меньше нуля, равное нулю или больше нуля в соответствии с порядком следования двух объектов

Range
. Поскольку перечисление
Card.Rank
в примере 9.8 имеет метод
valueOf,
мы могли бы использовать тот же прием и в методе
сотраreTo
класса
Card
.

Методы

equals,
представленные выше, выполняют проверку типов своих аргументов и возвращают
false
, как признак неравенства, если аргументы имеют не тот тип. Метод
compareTo
не имеет специального возвращаемого значения, с помощью которого можно было бы определить, что «эти два значения не могут сравниваться», поэтому обычно методы
compareTo
возбуждают исключение при передаче им аргументов неверного типа.

Примечательно, что метод

compareTo
класса
Range
, представленный выше, возвращает 0, когда два диапазона имеют одинаковые нижние границы. Это означает, что в данной реализации метод
сотрагеТо
считает равными любые два диапазона, которые имеют одинаковые нижние границы. Однако такое определение равенства не согласуется с определением, положенным в основу метода
equals,
который требует равенства обеих границ. Подобные несоответствия в определениях равенства могут стать причиной опасных ошибок, и было бы лучше привести методы
equals
и
compareTo
в соответствие друг с другом. Ниже приводится обновленная версия метода
compareTo
класса
Range
. Он соответствует методу
equals
и дополнительно возбуждает исключение при передаче ему несопоставимого значения:

// Порядок следования диапазонов определяется их нижними границами

// или верхними границами, если нижние границы равны.Возбуждает исключение,

// если методу передается объект, не являющийся экземпляром класса Range.

// Возвращает 0, только если this.equals(that) возвращает true.

Range.prototype.compareTo = function(that) {

  • Читать дальше
  • 1
  • ...
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: