Программирование на языке Ruby
Шрифт:
Отметим еще, что синоним
11.2.2. Специализация отдельного объекта
Я солипсист и, признаться, удивлен, что большинство из нас таковыми не являются.
В большинстве объектно-ориентированных языков все объекты одного класса ведут себя одинаково. Класс — это шаблон, порождающий объекты с одним и тем же интерфейсом при каждом вызове конструктора.
Ruby ведет себя так же, но это не конец истории. Получив объект, вы можете изменить его поведение на лету. По сути дела, вы ассоциируете с объектом частный, анонимный подкласс, все методы исходного подкласса остаются доступными, но добавляется еще и поведение, уникальное для данного объекта. Поскольку это поведение присуще лишь данному объекту, оно встречается только один раз. Нечто, встречающееся только один раз, называется синглетом (singleton). Так, мы имеем синглетные методы и синглетные классы.
Слово «синглет» может стать источником путаницы, потому что оно употребляется и в другом смысле - как название хорошо известного паттерна проектирования, описывающего класс, для которого может существовать лишь один объект. Если вас интересует такое использование, обратитесь к библиотеке
В следующем примере мы видим два объекта, оба строки. Для второго мы добавляем метод
Добавление синглетного метода к объекту порождает синглетный класс для данного объекта, если он еще не был создан ранее. Родителем синглетного класса является исходный класс объекта. (Можно считать, что это анонимный подкласс исходного класса.) Если вы хотите добавить к объекту несколько методов, то можете создать синглетный класс явно:
Отметим попутно, что у более «примитивных» объектов (например,
Если вам приходилось разбираться в коде библиотек, то наверняка вы сталкивались с идиоматическим использованием синглетных классов. В определении класса иногда встречается такой код:
В теле определения класса слово
Еще одно распространенное применение такой техники — определение на уровне класса вспомогательных функций, к которым можно обращаться из других мест внутри определения класса. Например, мы хотим определить несколько функций доступа, которые преобразуют результат своей работы в строку. Можно, конечно, написать отдельно код каждой такой функции. Но есть и более элегантное решение — определить функцию уровня класса
Чужак
1. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
рейтинг книги
Тактика победы
Великие полководцы
Документальная литература:
биографии и мемуары
рейтинг книги
Ваше Сиятельство
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
рейтинг книги
Маркс и Энгельс
421. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
рейтинг книги
Призрак
Звездный путь
Фантастика:
эпическая фантастика
космическая фантастика
рейтинг книги
Вечный. Книга V
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
рейтинг книги
Хроники Тамула. Трилогия
Тамули
Фантастика:
фэнтези
рейтинг книги
Сотворение миров (сборник)
Фантастика:
научная фантастика
рейтинг книги
Тень Инквизитора
8. Тайный Город
Фантастика:
боевая фантастика
рейтинг книги
Я все еще барон
4. Дорогой барон!
Фантастика:
боевая фантастика
рейтинг книги
Гримуар темного лорда V
5. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
рейтинг книги
Проданная Истинная. Месть по-драконьи
Любовные романы:
любовно-фантастические романы
рейтинг книги
Тевтонский крест
1. Тевтонский крест
Фантастика:
альтернативная история
рейтинг книги