Программирование на языке 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
Напомним, что для выполнения присваивания атрибуту необходимо указывать вызывающий объект, а внутри метода нужно в качестве такого объекта указывать
self
11.1.3. Более сложные конструкторы
По мере усложнения объектов у них появляется все больше атрибутов, которые необходимо инициализировать в момент создания. Соответствующий конструктор может оказаться длинным и запутанным, его параметры даже не будут помещаться на одной строке.
Чтобы справиться со сложностью, можно передать методу
initialize
eval
instance_eval
class PersonalComputer
attr_accessor :manufacturer,
:model, :processor, :clock,
:ram, :disk, :monitor,
:colors, :vres, :hres, :net
def initialize(&block)
instance_eval &block
end
# Прочие методы...
end
desktop = 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"
end
p desktop
Отметим несколько нюансов. Во-первых, мы пользуемся методами доступа к атрибутам, поэтому присваивание им значений интуитивно понятно. Во-вторых, ссылка на
self
Ясно, что в теле блока можно делать все, что угодно. Например, можно было бы вычислить некоторые поля на основе других.
А если вам не нужны методы доступа для всех атрибутов? Если хотите, можете избавиться от лишних, вызвав для них метод
undef
11.1.4. Создание атрибутов и методов уровня класса
Метод или атрибут не всегда ассоциируются с конкретным экземпляром класса, они могут принадлежать самому классу. Типичным примером метода класса может служить
new
Мы можем определять собственные методы класса, как показано в разделе 11.1.1. Конечно, их функциональность не ограничивается конструированием — они могут выполнять любые операции, имеющие смысл именно на уровне класса.
В следующем далеко не полном фрагменте предполагается, что мы создаем класс для проигрывания звуковых файлов. Метод
play
detect_hardware
class SoundPlayer
MAX_SAMPLE = 192
def SoundPlayer.detect_hardware
# ...
end
def play
# ...
end
end
Есть еще один способ объявить этот метод класса. В следующем фрагменте делается практически то же самое:
class SoundPlayer
MAX_SAMPLE =192
def play
# ...
end
end
def SoundPlayer.detect_hardware
# ...
end
Единственная разница касается использования объявленных в классе констант. Если метод класса объявлен вне объявления самого класса, то эти константы оказываются вне области видимости. Например, в первом фрагменте метод
detect_hardware
MAX_SAMPLE
SoundPlayer::MAX_SAMPLE
Не удивительно, что помимо методов класса есть еще и переменные класса. Их имена начинаются с двух знаков
@
Традиционный пример использования переменных класса - подсчет числа его экземпляров. Но они могут применяться всегда, когда информации имеет смысл в контексте класса в целом, а не отдельного объекта. Другой пример приведен в листинге 11.3.
class Metal