Книга: Программирование на языке Ruby
11.2.10. Автоматическое определение методов чтения и установки на уровне класса
11.2.10. Автоматическое определение методов чтения и установки на уровне класса
Мы уже рассматривали методы attr_reader
, attr_writer
и attr_accessor
, которые немного упрощают определение методов чтения и установки атрибутов экземпляра. А как быть с атрибутами уровня класса?
В Ruby нет аналогичных средств для их автоматического создания. Но можно написать нечто подобное самостоятельно.
В первом издании этой книги была показана хитроумная схема на основе метода class_eval
. С ее помощью мы создали такие методы, как cattr_reader
и cattr_writer
.
Но есть более простой путь. Откроем синглетный класс и воспользуемся в нем семейством методов attr
. Получающиеся переменные экземпляра для синглетного класса станут переменными экземпляра класса. Часто это оказывается лучше, чем переменные класса, поскольку они принадлежат данному и только данному классу, не распространяясь вверх и вниз по иерархии наследования.
class MyClass
@alpha = 123 # Инициализировать @alpha.
class << self
attr_reader :alpha # MyClass.alpha()
attr_writer :beta # MyClass.beta=()
attr_accessor :gamma # MyClass.gamma() и
end # MyClass.gamma=()
def MyClass.look
puts " #@alpha, #@beta, #@gamma"
end
#...
end
puts MyClass.alpha # 123
MyClass.beta = 456
MyClass.gamma = 789
puts MyClass.gamma # 789
MyClass.look # 123, 456, 789
Как правило, класс без переменных экземпляра бесполезен. Но здесь мы их для краткости опустили.
- 11.2.1. Отправка объекту явного сообщения
- 11.2.2. Специализация отдельного объекта
- 11.2.3. Вложенные классы и модули
- 11.2.4. Создание параметрических классов
- 11.2.5. Использование продолжений для реализации генератора
- 11.2.6. Хранение кода в виде объекта
- 11.2.7. Как работает включение модулей?
- 11.2.8. Опознание параметров, заданных по умолчанию
- 11.2.9. Делегирование или перенаправление
- 11.2.10. Автоматическое определение методов чтения и установки на уровне класса
- 11.2.11. Поддержка различных стилей программирования
- 3.4. Отношения между классами
- 1.2. Определение количества информации. Единицы измерения количества информации
- Определение версии клиента
- Определение пользовательского формата числовых данных
- Определение целей. Построение цепочек
- Множественные интерфейсы и имена методов
- Определение необходимого системного вызова
- Перегрузка методов с несколькими параметрами типа
- Раздел 1 Лояльность: определение и ключевые факторы
- Определение позиционного уровня
- 6.2. Создание и автоматическое заполнение бланков стандартных документов
- 3.3. Определение объектов защиты