Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
attr_reader :a1, :a2 # Создаются @a1, a1, @a2, a2 attr_writer :b1, :b2 # Создаются @b1, b1=, @b2, b2 = attr_accessor :c1, :c2 # Создаются @c1, c1, c1=, @c2, c2, c2= # ...endНапомним, что для выполнения присваивания атрибуту необходимо указывать вызывающий объект, а внутри метода нужно в качестве такого объекта указывать
self11.1.3. Более сложные конструкторы
По мере усложнения объектов у них появляется все больше атрибутов, которые необходимо инициализировать в момент создания. Соответствующий конструктор может оказаться длинным и запутанным, его параметры даже не будут помещаться на одной строке.
Чтобы справиться со сложностью, можно передать методу
initializeevalinstance_evalclass PersonalComputer attr_accessor :manufacturer, :model, :processor, :clock, :ram, :disk, :monitor, :colors, :vres, :hres, :net def initialize(&block) instance_eval &block end # Прочие методы...enddesktop = PersonalComputer.new do self.manufacturer = "Acme" self.model = "THX-1138" self.processor = "986" self.clock = 9.6 # ГГц self.ram =16 # Гб self.disk =20 # T6 self.monitor = 25 # дюймы self.colors = 16777216 self.vres = 1280 self.hres = 1600 self.net = "T3"endp desktopОтметим несколько нюансов. Во-первых, мы пользуемся методами доступа к атрибутам, поэтому присваивание им значений интуитивно понятно. Во-вторых, ссылка на
selfЯсно, что в теле блока можно делать все, что угодно. Например, можно было бы вычислить некоторые поля на основе других.
А если вам не нужны методы доступа для всех атрибутов? Если хотите, можете избавиться от лишних, вызвав для них метод
undef11.1.4. Создание атрибутов и методов уровня класса
Метод или атрибут не всегда ассоциируются с конкретным экземпляром класса, они могут принадлежать самому классу. Типичным примером метода класса может служить
newМы можем определять собственные методы класса, как показано в разделе 11.1.1. Конечно, их функциональность не ограничивается конструированием — они могут выполнять любые операции, имеющие смысл именно на уровне класса.
В следующем далеко не полном фрагменте предполагается, что мы создаем класс для проигрывания звуковых файлов. Метод
playdetect_hardwareclass SoundPlayer MAX_SAMPLE = 192 def SoundPlayer.detect_hardware # ... end def play # ... endendЕсть еще один способ объявить этот метод класса. В следующем фрагменте делается практически то же самое:
class SoundPlayerMAX_SAMPLE =192 def play # ... endenddef SoundPlayer.detect_hardware # ...endЕдинственная разница касается использования объявленных в классе констант. Если метод класса объявлен вне объявления самого класса, то эти константы оказываются вне области видимости. Например, в первом фрагменте метод
detect_hardwareMAX_SAMPLESoundPlayer::MAX_SAMPLEНе удивительно, что помимо методов класса есть еще и переменные класса. Их имена начинаются с двух знаков
@Традиционный пример использования переменных класса - подсчет числа его экземпляров. Но они могут применяться всегда, когда информации имеет смысл в контексте класса в целом, а не отдельного объекта. Другой пример приведен в листинге 11.3.
class Metal
