Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

end

Часто мы хотим каким-то образом восстановиться после ошибки. В этом поможет ключевое слово

retry
(внутри тела обработчика
rescue
). Оно позволяет повторно войти в блок
begin
и попытаться еще раз выполнить операцию:

begin

 # Код, в котором может возникнуть ошибка...

rescue

 # Пытаемся восстановиться...

 retry #
Попробуем еще раз.

end

Наконец, иногда необходим код, который «подчищает» что-то после выполнения блока

begin-end
. В этом случае можно добавить часть
ensure
:

begin

 # Код, в котором может возникнуть ошибка...

rescue

 # Обработка исключений.

ensure

 # Этот код выполняется в любом случае.

end

Код, помещенный внутрь части

ensure
, выполняется при любом способе выхода из блока
begin-end
— вне зависимости от того, произошло исключение или нет.

Исключения можно перехватывать еще двумя способами. Во-первых, существует форма

rescue
в виде модификатора:

x = a/b rescue puts("Деление на нуль!")

Кроме того, тело определения метода представляет собой неявный блок

begin-end
; слово
begin
опущено, а все тело метода подготовлено к обработке исключения и завершается словом
end
:

def some_method

 # Код...

rescue

 # Восстановление после ошибки...

end

На этом мы завершаем как обсуждение обработки исключений, так и рассмотрение основ синтаксиса и семантики в целом.

У Ruby есть многочисленные аспекты, которых мы не коснулись. Оставшаяся часть главы посвящена более развитым возможностям языка, в том числе рассмотрению ряда практических приемов, которые помогут программисту среднего уровня научиться «думать на Ruby».

1.3. ООП в Ruby

В языке Ruby есть все элементы, которые принято ассоциировать с объектно-ориентированными языками: объекты с инкапсуляцией и сокрытием данных, методы с полиморфизмом и переопределением, классы с иерархией и наследованием. Но Ruby идет дальше, добавляя ограниченные возможности создания метаклассов, синглетные методы, модули и классы-примеси.

Похожие идеи, только под иными именами, встречаются и в других объектно-ориентированных языках, но одно и то же название может скрывать тонкие различия. В этом разделе мы уточним, что в Ruby понимается под каждым из элементов ООП.

1.3.1. Объекты

В Ruby все числа, строки, массивы, регулярные выражения и многие другие сущности фактически являются объектами. Работа программы состоит в вызове методов разных объектов:

3.succ # 4

"abc".upcase # "ABC"

[2,1,5,3,4].sort # [1,2,3,4,5]

someObject.someMethod #
какой-то результат

В Ruby каждый объект представляет собой экземпляр какого-то класса. Класс содержит реализацию методов:

"abc".class # String

"abc".class.class # Class

Помимо инкапсуляции собственных атрибутов и операций объект в Ruby имеет уникальный идентификатор:

"abc".object_id # 53744407

Этот идентификатор объекта обычно не представляет интереса для программиста.

1.3.2. Встроенные классы

Свыше 30 классов уже встроено в Ruby. Как и во многих других объектно-ориентированных языках, в нем не допускается множественное наследование, но это еще не означает, что язык стал менее выразительным. Современные языки часто построены согласно модели одиночного наследования. Ruby поддерживает модули и классы-примеси, которые мы обсудим в следующей главе. Также реализованы идентификаторы объектов, что позволяет строить устойчивые, распределенные и перемещаемые объекты.

Для создания объекта существующего класса обычно используется метод

new
:

myFile = File.new("textfile.txt","w")

myString = String.new("Это строковый объект")

Однако не всегда его обязательно вызывать явно. В частности, при создании объекта String можно и не упоминать этот метод:

yourString = "Это тоже строковый объект"

aNumber =5 # и здесь метод new не нужен

Ссылки на объекты хранятся в переменных. Выше уже отмечалось, что сами переменные не имеют типа и не являются объектами — они лишь ссылаются на объекты.

x = "abc"

Из этого правила есть исключение: небольшие неизменяемые объекты некоторых встроенных классов, например

Fixnum
, непосредственно копируются в переменные, которые на них ссылаются. (Размер этих объектов не превышает размера указателя, поэтому хранить их таким образом более эффективно.) В таком случае во время присваивания делается копия объекта, а куча не используется.

При присваивании переменных ссылки на объекты обобществляются.

y = "abc"

x = y

x # "abc"

После выполнения присваивания

x = y
и
x
, и 
y
ссылаются на один и тот же объект:

x.object_id # 53732208

y.object_id # 53732208

Если объект изменяемый, то модификация, примененная к одной переменной, отражается и на другой:

x.gsub!(/а/, "x")

y # "хbс"

Однако новое присваивание любой из этих переменных не влияет на другую:

Поделиться:
Популярные книги

Не та профессия. Тетрология

Афанасьев Семён
Не та профессия
Фантастика:
фэнтези
3.60
рейтинг книги
Не та профессия. Тетрология

Охотник 4: Вендетта

Робский Александр
4. Загадка Бога
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Охотник 4: Вендетта

Дорога ветров

Уильямс Тэд
3. Орден Манускрипта
Фантастика:
фэнтези
7.75
рейтинг книги
Дорога ветров

Я стану твоей судьбой

Лаврова Лана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я стану твоей судьбой

Боевой кузнец. Дилогия

Аверьянов Евгений
Древние механизмы
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Боевой кузнец. Дилогия

Искатель приключений

де Монтепен Ксавье
Приключения:
исторические приключения
6.25
рейтинг книги
Искатель приключений

После нас - хоть потом

Лукина Любовь Александровна
Фантастика:
фэнтези
научная фантастика
7.43
рейтинг книги
После нас - хоть потом

Свободное радио Альбемута (сборник)

Дик Филип Киндред
Шедевры фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Свободное радио Альбемута (сборник)

Стрелок. Извлечение троих. Бесплодные земли

Кинг Стивен
Фантастика:
фэнтези
5.00
рейтинг книги
Стрелок. Извлечение троих. Бесплодные земли

Господин маг. Трилогия

Смекалин Дмитрий
Господин маг
Фантастика:
фэнтези
героическая фантастика
6.00
рейтинг книги
Господин маг. Трилогия

Будущее, XXII век. Прогрессоры

Стругацкие Аркадий и Борис
Гиганты фантастики
Фантастика:
научная фантастика
7.00
рейтинг книги
Будущее, XXII век. Прогрессоры

"Фантастика 2024-12". Компиляция. Книги 1-21

Шалашов Евгений Васильевич
Фантастика 2024. Компиляция
Фантастика:
фэнтези
боевая фантастика
детективная фантастика
альтернативная история
5.00
рейтинг книги
Фантастика 2024-12. Компиляция. Книги 1-21

Маленькая женщина Большого

Зайцева Мария
5. Наша
Любовные романы:
эро литература
современные любовные романы
5.40
рейтинг книги
Маленькая женщина Большого

Музыкальный приворот. Часть 2

Анна Джейн
Любовные романы:
современные любовные романы
5.62
рейтинг книги
Музыкальный приворот. Часть 2