7.1. Протокол класса Collection 121
redCollection определяется последовательностью операций по их добавле-
нию и удалению. Элементами экземпляров класса OrderedCollection могут
быть любые объекты. Порядок среди элементов экземпляров классов In-
terval и SortedCollection определяется внутренними свойствами самих эле-
ментов и никакими средствами не может быть изменен извне. Элементы эк-
земпляра класса Interval составляют арифметическую прогрессию, которая
однозначно определяется во время инициализации экземпляра. Для клас-
са SortedCollection порядок элементов определяется заданным для данного
экземпляра блоком (функцией) сортировки.
Экземпляр класса Dictionary — несортированный набор с внешними
ключами, которые могут быть любыми объектами системы, а сравнение
ключей происходит с помощью равенства =. В его подклассах IdentityDic-
tionary, SystemDictionary внешние ключи сравниваются с помощью опера-
ции тождества ==, что происходит значительно быстрее.
Наша цель — коротко описать протокол самого класса Collection и все
особенности протоколов сообщений его подклассов, а также привести про-
стые поясняющие примеры.
Один из общих протоколов класса Collection нам уже знаком: это прото-
кол, обеспечивающий итерации над наборами (его часто называют прото-
колом перечисления). Кроме того, класс Collection обеспечивает протоколы
для создания новых наборов, преобразования наборов, добавления и удале-
ния элементов, определения текущего состояния набора.
7.1.1. Создание новых наборов
В главе, посвященной синтаксису языка, приводились примеры лите-
рального создания некоторых наборов (экземпляров классов Array, String,
Symbol). Для создания новых наборов можно также использовать сообще-
ния new и new:. Но протокол класса Collection содержит специальные со-
общения класса, обеспечивающие создание нового набора с одним, двумя,
тремя или четырьмя элементами (в зависимости от числа ключевых слов
with: в ключевом сообщении). Например:
Set with: $a with: $b with: $c. → Set($a $b $c)
Заметим, что основная причина, по которой обеспечиваются только эти
четыре сообщения создания экземпляров, а не больше и не меньше, состоит
в том, что именно такое их количество оказалось достаточным для решения
всех тех задач, ради которых эти сообщения вставлялись разработчиками
в систему. При желании их число можно увеличить. Например, создадим
метод порождения нового экземпляра с элементами из массива-аргумента: