Наследование суперклассу

июня 23, 2008

Можно унаследовать класс, воспользовавшись символом <:
class Boojum < Snark
# …
end
Это объявление говорит, что класс Boojum является подклассом класса Snark или - что то же самое - класс Snark является суперклассом класса Boojum. Всем известно, что каждый буюм является снарком, но не каждый снарк - буюм.
Ясно, что цель наследования - расширить или специализировать функциональность. Мы хотим [...]

Читать далее →

Применение нескольких конструкторов

июня 19, 2008

В Ruby нет «настоящих» конструкторов, как в C++ или в Java. Сама идея, конечно, никуда не делась, поскольку объекты необходимо создавать и инициализировать, но реализация выглядит иначе.
В Ruby каждый класс имеет метод класса new, который вызывается для создания новых объектов. Метод new вызывает специальный определяемый пользователем метод initialize, который инициализирует атрибуты объекта, после чего new [...]

Читать далее →

Рутинные объектно-ориентированные задачи

июня 19, 2008

Of his quick objects hath the mind no pa?t,
Nor his own vision holds what it doth catch…
Вильям Шекспир, Сонет 113
Если вы вообще не знакомы с ООП, то эта глава вас ничему не научит. А если вы понимаете, что такое ООП в языке Ruby, то, наверное, ее и читать не стоит. Если понятия ООП не слишком [...]

Читать далее →

ООП и динамические механизмы в Ruby

июня 19, 2008

Как введение иррациональных чисел… стало удобным мифом,
упростившим законы арифметики… так физические объекты
и постулированные сущности делают наше восприятие реальности более
простым и завершенным… Концептуальная схема физических объектов
напоминает удобный миф, который проще, чем истина,
но при этом содержит тут и там частички истины.
Уиллард Ван Орман Квин
Это необычная глава. В большинстве других глав рассматривается какой-то конкретный аспект, например строки или [...]

Читать далее →

Исключения

июня 19, 2008

Как и многие другие современные языки, Ruby поддерживает исключения.
Исключения - это механизм обработки ошибок, имеющий существенные преимущества
по сравнения с прежними подходами. Нам удается избежать возврата
кодов ошибок и запутанной логики их анализа, а код, который обнаруживает
ошибку, можно отделить от кода, который ее обрабатывает (чаще всего они так
или иначе разделены).
Предложение raise возбуждает исключение. Отметим, что raise - [...]

Читать далее →

Циклы и ветвление

июня 19, 2008

Потратим немного времени на изучение управляющих конструкций. Мы уже ви
дели простое предложение if и модификатор if. Существуют также парные струк
туры, в которых используется ключевое слово unless (в них также может присутствовать
необязательная ветвь else), а равно применяемые в выражениях формы
if и unless.
Здесь формы с ключевыми словами if и unless, располпженные в одной строке, выполняют в точности [...]

Читать далее →

Преобразование строки в символ и обратно

июня 18, 2008

Строки и символы можно преобразовывать друг в друга с помощью методов to_str и to_sym:
а = “foobar”
b = :foobar
a == b.to_str   # true
b == a.to_sym   # true
Для метапрограммирования иногда бывает полезен такой метод:
class Symbol
def +(other)
(self.to_s + other.to_s) .to_sym
end
end
Он позволяет конкатенировать символы (или дописывать строку в конец символа). Ниже приведен пример использования; мы принимаем на входе символ [...]

Читать далее →

Символы, переменные и методы

июня 18, 2008

Наверное, чаще всего символы применяются для определения атрибутов класса:
class MyClass
attr_reader :alpha, :beta
attr_writer :gamma, -.delta
attr_accessor :epsilon
# …
end
Имейте в виду, что в этом фрагменте на самом деле исполняется некий код. Например, attr_accessor использует имя символа для определения имени переменной экземпляра, а также методов для ее чтения и изменения. Это не означает, что всегда имеется точное соответствие между [...]

Читать далее →

Символы как метазначения

июня 18, 2008

Мы нередко пользуемся исключениями, чтобы уйти от кодов возврата. Но никто не мешает возвращать коды ошибки, если вам так хочется. К тому же в Ruby метод может возвращать более одного значения.
В таком механизме часто возникает необходимость. Когда-то символ NUL кода ASCII вообще не считался символом. В языке С есть понятие нулевого указателя (null), в Pascal [...]

Читать далее →

Символы как перечисления

июня 18, 2008

В языке Pascal и в поздних версиях С есть понятие перечисляемого типа. В Ruby ничего подобного быть не может, ведь никакого контроля типов не производится. Но символы часто используются как мнемонические имена; стороны света можно было бы представить как :north, :south, :east и :west.
Быть может, немного понятнее хранить их в виде констант:

North, South, East, West [...]

Читать далее →