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