Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Путь Ruby

Покупка
Артикул: 816356.01.99
Доступ онлайн
799 ₽
В корзину
Уже больше десяти лет программисты на Ruby обращаются к данной книге как к надежному источнику сведений о том, как эффективно писать на этом языке. А теперь Хэл Фултон и Андрэ Арко изрядно обновили этот классический труд, включив описание новых средств языка и инструментов. Новое издание охватывает версию Ruby 2.1 и содержит более 400 примеров, отвечающих на вопрос «Как это делается в Ruby?». Все примеры сопровождаются подробным описанием задачи и технических ограничений. Затем дается пошаговое объяснение одного хорошего решения с детальными комментариями, позволяющими лучше усвоить материал. Третье издание удобно организовано по темам, так что стало еще проще найти ответ на свой вопрос и писать более качественный код в согласии с духом и философией Ruby.
Фултон, Х. Путь Ruby : практическое руководство / Х. Фултон, А. Арко ; пер. с англ. А. A. Слинкина. — 4-е изд. - Москва : ДМК Пресс, 2023. - 666 с. - ISBN 978-5-89818-334-9. - Текст : электронный. - URL: https://znanium.com/catalog/product/2102621 (дата обращения: 05.05.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Хэл Фултон совместно с Андрэ Арко

Путь Ruby
The Ruby Way, ThiRd ediTion

hal FulTon 

WiTh andRe' aRko

 Addison Wesley
Upper Saddle River, NJ • Boston • Indianapolis • San Francisco 
New York • Toronto • Montreal • London • Munich • Paris • Madrid 
Cape Town • Sydney • Tokyo • Singapore • Mexico City
Москва, 2023

Путь Ruby

Хэл Фултон

совместно с Андрэ Арко

4-е издание, электронное
УДК 004.438Ruby
ББК 32.973.22
Ф94

Ф94
Фултон, Хэл.
Путь Ruby / Х. Фултон, А. Арко ; пер. с англ. А. A. Слинкина. — 4-е изд., эл. — 1 файл 
pdf : 666 с. — Москва : ДМК Пресс, 2023. — Систем. требования: Adobe Reader XI либо 
Adobe Digital Editions 4.5 ; экран 10". — Текст : электронный.
ISBN 978-5-89818-334-9

Уже больше десяти лет программисты на Ruby обращаются к данной книге как к надежному 
источнику сведений о том, как эффективно писать на этом языке. А теперь Хэл Фултон и Андрэ 
Арко изрядно обновили этот классический труд, включив описание новых средств языка и инструментов.

Новое издание охватывает версию Ruby 2.1 и содержит более 400 примеров, отвечающих на 
вопрос «Как это делается в Ruby?». Все примеры сопровождаются подробным описанием задачи 
и технических ограничений. Затем дается пошаговое объяснение одного хорошего решения с детальными 
комментариями, позволяющими лучше усвоить материал.
Третье издание удобно организовано по темам, так что стало еще проще найти ответ на свой 
вопрос и писать более качественный код в согласии с духом и философией Ruby.

УДК 004.438Ruby 
ББК 32.973.22

Электронное издание на основе печатного издания: Путь Ruby / Х. Фултон, А. Арко ; пер. с англ. А. A. Слин-
кина. — 3-е изд. — Москва : ДМК Пресс, 2016. — 664 с. — ISBN 978-5-97060-320-8. — Текст : непосредственный.

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

В соответствии со ст. 1299 и 1301 ГК РФ при устранении ограничений, установленных техническими средствами защиты авторских 
прав, правообладатель вправе требовать от нарушителя возмещения убытков или выплаты компенсации.

ISBN 978-5-89818-334-9
© Pearson Education, Inc.
© Оформление, перевод, ДМК Пресс, 2016
Моим родителям, без которых меня не было бы.
— Хэл
Содержание

Предисловие ......................................................... 22

Благодарности ....................................................... 26

Об авторах ............................................................ 29

Введение .............................................................. 30

Глава 1. Обзор Ruby ................................................ 39
1.1. Введение в объектно-ориентированное  
программирование .....................................................................40
1.1.1. Что такое объект ............................................................40
1.1.2. Наследование................................................................41
1.1.3. Полиморфизм ...............................................................43
1.1.4. Еще немного терминов ..................................................44
1.2. Базовый синтаксис и семантика Ruby ...................................45
1.2.1. Ключевые слова и идентификаторы ...............................46
1.2.2. Комментарии и встроенная документация .....................47
1.2.3. Константы, переменные и типы .....................................47
1.2.4. Операторы и приоритеты ...............................................49
1.2.5. Пример программы .......................................................50
1.2.6. Циклы и ветвление.........................................................53
1.2.7. Исключения ...................................................................57
1.3. ООП в Ruby ...........................................................................59
1.3.1. Объекты ........................................................................60
1.3.2. Встроенные классы .......................................................60
1.3.3. Модули и классы-примеси .............................................61
1.3.4. Создание классов ..........................................................62
1.3.5. Методы и атрибуты ........................................................66
1.4. Динамические аспекты Ruby .................................................68
1.4.1. Кодирование во время выполнения ...............................69
1.4.2. Отражение .....................................................................70
1.4.3. Отсутствующие методы .................................................72
1.4.4. Сборка мусора...............................................................72
1.5. Потренируйте свою интуицию: что следует запомнить..........73
1.5.1. Синтаксис ......................................................................73
1.5.2. Отличия от других языков ..............................................75
1.5.3. Предложение case в Ruby ..............................................77
1.5.4. Рубизмы и идиомы ........................................................80
1.5.5. Ориентация на выражения и прочие вопросы ................85
1.6. Жаргон Ruby .........................................................................87
1.7. Заключение ..........................................................................90

Глава 2. Строки ...................................................... 91
2.1. Представление обычных строк .............................................91
2.2. Альтернативная нотация для представления строк ...............92
2.3. Встроенные документы ........................................................93
2.4. Получение длины строки ......................................................94
2.5. Построчная обработка ..........................................................94
2.6. Побайтовая обработка ..........................................................95
2.7. Специализированное сравнение строк .................................96
2.8. Разбиение строки на лексемы ..............................................97
2.9. Форматирование строк ........................................................98
2.10. Строки в качестве объектов ввода-вывода ..........................99
2.11. Управление регистром .......................................................99
2.12. Вычленение и замена подстрок ........................................100
2.13. Подстановка в строках ......................................................102
2.14. Поиск в строке ..................................................................103
2.15. Преобразование символов в коды ASCII и обратно ...........104
2.16. Явные и неявные преобразования ....................................104
2.17. Дописывание в конец строки ............................................106
2.18. Удаление хвостовых символов новой строки и прочих ......106
2.19. Убирание лишних пропусков .............................................107
2.20. Повтор строк ....................................................................108
2.21. Включение выражений в строку ........................................108
2.22. Отложенная интерполяция ................................................109
2.23. Разбор данных, разделенных запятыми ............................109
2.24. Преобразование строки в число (десятичное или иное) ....110
2.25. Кодирование и декодирование строк в кодировке rot13 ....111
2.26. Шифрование строк ...........................................................112
2.27. Сжатие строк ....................................................................113
2.28. Подсчет числа символов в строке .....................................113
2.29. Обращение строки ............................................................114

Содержание
2.30. Удаление дубликатов ........................................................114
2.31. Удаление заданных символов ...........................................114
2.32. Печать специальных символов ..........................................115
2.33. Генерирование последовательности строк .......................115
2.34. Вычисление 32-разрядного CRC .......................................115
2.35. Вычисление SHA-256-свертки строки ...............................116
2.36. Вычисление расстояния Левенштейна между двумя  
строками ...................................................................................117
2.37. base64-кодирование и декодирование строк ....................118
2.38. Замена символов табуляции пробелами  
и сворачивание пробелов в табуляторы ....................................119
2.39. Перенос строк по словам ..................................................120
2.40. Заключение ......................................................................121

Глава 3. Регулярные выражения ...............................122
3.1. Синтаксис регулярных выражений ......................................122
3.2. Компиляция регулярных выражений ...................................124
3.3. Экранирование специальных символов ..............................125
3.4. Якоря ..................................................................................125
3.5. Кванторы ............................................................................126
3.6. Позитивное и негативное заглядывание вперед .................128
3.7. Позитивное и негативное оглядывание назад .....................129
3.8. Обратные ссылки ................................................................130
3.9. Именованные соответствия ................................................133
3.10. Классы символов ..............................................................134
3.11. Обобщенные регулярные выражения ................................135
3.12. Сопоставление точки символу конца строки .....................136
3.13. Внутренние модификаторы ..............................................137
3.14. Внутренние подвыражения ...............................................137
3.14.1. Рекурсия в регулярных выражениях ...........................138
3.15. Примеры регулярных выражений ......................................139
3.15.1. Сопоставление с IP-адресом .....................................139
3.15.2. Сопоставление с парой «ключ-значение» ...................140
3.15.3. Сопоставление с числами, записанными  
римскими цифрами ..............................................................140
3.15.4. Сопоставление с числовыми константами .................141
3.15.5. Сопоставление с датой и временем ...........................141
3.15.6. Обнаружение удвоенных слов в тексте ......................142
3.15.7. Поиск слов, записанных одними заглавными  
буквами ................................................................................142

Содержание
Содержание

3.15.8. Сопоставление с номером версии .............................143
3.15.9. Еще несколько образцов............................................143
3.16. Заключение ......................................................................144

Глава 4. Интернационализация в Ruby .......................145
4.1. Исторические сведения и терминология ............................146
4.2. Работа с кодировками ........................................................150
4.2.1. Нормализация .............................................................151
4.2.2. Преобразование из одной кодировки в другую ............154
4.2.3. Транслитерация ...........................................................155
4.2.4. Упорядочение строк ....................................................156
4.3. Перевод .............................................................................158
4.3.1. Значения по умолчанию ...............................................160
4.3.2. Пространства имен ......................................................161
4.3.3. Интерполяция ..............................................................161
4.3.4. Формы множественного числа ....................................162
4.4. Локализованное форматирование ......................................164
4.4.1. Дата и время ...............................................................164
4.4.2. Числа ...........................................................................165
4.4.3. Денежные величины ....................................................165
4.5. Заключение ........................................................................165

Глава 5. Численные методы .....................................167
5.1. Представление чисел в языке Ruby .....................................167
5.2. Основные операции над числами .......................................168
5.3. Округление чисел с плавающей точкой ...............................169
5.4. Сравнение чисел с плавающей точкой ................................171
5.5. Форматирование чисел для вывода ....................................172
5.6. Вставка разделителей при форматировании чисел ............173
5.7. Работа с очень большими числами .....................................173
5.8. Использование класса BigDecimal ......................................174
5.9. Работа с рациональными числами ......................................175
5.10. Перемножение матриц .....................................................176
5.11. Комплексные числа ..........................................................180
5.12. Библиотека mathn .............................................................181
5.13. Разложение на простые множители, вычисление НОД  
и НОК ........................................................................................181
5.14. Простые числа ..................................................................182
5.15. Явные и неявные преобразования чисел ...........................183
5.16. Приведение числовых значений........................................184
5.17. Поразрядные операции над числами ................................185
5.18. Преобразование системы счисления ................................186
5.19. Извлечение кубических корней, корней четвертой  
степени и т.д. ............................................................................187
5.20. Определение порядка байтов ...........................................188
5.21. Численное вычисление определенного интеграла ............189
5.22. Тригонометрия в градусах, радианах и градах ..................190
5.23. Вычисление логарифмов по произвольному основанию ...191
5.24. Вычисление среднего, медианы и моды набора данных ...191
5.25. Дисперсия и стандартное отклонение ..............................193
5.26. Вычисление коэффициента корреляции ...........................193
5.27. Генерирование случайных чисел .......................................195
5.28. Кэширование функций с помощью метода memoize .........195
5.29. Заключение ......................................................................197

Глава 6. Символы и диапазоны ................................198
6.1. Символы .............................................................................198
6.1.1. Символы как перечисления .........................................200
6.1.2. Символы как метазначения..........................................200
6.1.3. Символы, переменные и методы .................................201
6.1.4. Преобразование строки в символ и обратно ................201
6.2. Диапазоны ..........................................................................203
6.2.1. Открытые и замкнутые диапазоны ...............................203
6.2.2. Нахождение границ диапазона ....................................203
6.2.3. Обход диапазона .........................................................203
6.2.4. Проверка принадлежности диапазону .........................204
6.2.5. Преобразование в массив ...........................................205
6.2.6. Обратные диапазоны ...................................................205
6.2.7. Оператор переключения ..............................................206
6.2.8. Нестандартные диапазоны ..........................................208
6.3. Заключение ........................................................................211

Глава 7. Дата и время .............................................212
7.1. Определение текущего момента времени ..........................213
7.2. Работа с конкретными датами (после точки отсчета) ..........213
7.3. Определение дня недели ....................................................214
7.4. Определение даты Пасхи ....................................................215
7.5. Вычисление n-ого дня недели в месяце ..............................215
7.6. Преобразование из секунд в более крупные единицы .........216
7.7. Вычисление промежутка времени, прошедшего  

Содержание
от точки отсчета ........................................................................217
7.8. Високосные секунды ..........................................................217
7.9. Определение порядкового номера дня в году .....................218
7.10. Контроль даты и времени .................................................218
7.11. Определение недели в году ..............................................219
7.12. Проверка года на високосность ........................................220
7.13. Определение часового пояса ............................................220
7.14. Манипулирование временем без даты ..............................221
7.15. Сравнение моментов времени ..........................................221
7.16. Прибавление интервала к моменту времени .....................221
7.17. Вычисление разности между двумя моментами  
времени ....................................................................................222
7.18. Работа с конкретными датами (до точки отсчета) ..............222
7.19. Взаимные преобразования объектов Date, Time  
и DateTime .................................................................................223
7.20. Извлечение даты и времени из строки ..............................223
7.21. Форматирование и печать даты и времени .......................224
7.22. Преобразование часовых поясов ......................................225
7.23. Определение числа дней в месяце ...................................225
7.24. Разбиение месяца на недели ............................................226
7.25. Заключение ......................................................................227

Глава 8. Массивы, хэши и другие перечисляемые 
структуры .........................................................228
8.1. Массивы .............................................................................228
8.1.1. Создание и инициализация массива............................229
8.1.2. Доступ к элементам массива и присваивание  
им значений ..........................................................................230
8.1.3. Определение размера массива ...................................231
8.1.4. Сравнение массивов ...................................................231
8.1.5. Сортировка массива ....................................................233
8.1.6. Выборка из массива по заданному критерию ..............235
8.1.7. Специализированные функции индексирования..........236
8.1.8. Реализация разреженной матрицы ..............................238
8.1.9. Массивы как математические множества ....................239
8.1.10. Рандомизация массива .............................................242
8.1.11. Многомерные массивы ..............................................243
8.1.12. Нахождение элементов, принадлежащих одному  
массиву и не принадлежащих другому ..................................244
8.1.13. Преобразование или отображение массивов .............244

Содержание
8.1.14. Удаление элементов, равных nil, из массива ..............244
8.1.15. Удаление заданных элементов из массива ................244
8.1.16. Конкатенирование массивов и добавление  
в конец массива ....................................................................246
8.1.17. Использование массива в качестве стека  
или очереди ..........................................................................247
8.1.18. Обход массива ..........................................................247
8.1.19. Преобразование массива в строку  
с разделителями ...................................................................248
8.1.20. Обращение массива ..................................................248
8.1.21. Удаление дубликатов из массива ...............................248
8.1.22. Чередование массивов ..............................................248
8.1.23. Вычисление частоты различных значений  
в массиве ..............................................................................249
8.1.24. Инвертирование массива для получения хэша ...........249
8.1.25. Синхронная сортировка нескольких массивов ...........250
8.1.26. Задание значения по умолчанию для новых  
элементов массива ...............................................................250
8.2. Хэши ...................................................................................251
8.2.1. Создание нового хэша .................................................252
8.2.2. Задание значения по умолчанию для хэша ..................252
8.2.3. Доступ к парам ключ-значение и добавление  
новых пар ..............................................................................253
8.2.4. Удаление пар ключ-значение .......................................254
8.2.5. Обход хэша ..................................................................255
8.2.6. Инвертирование хэша .................................................255
8.2.7. Поиск ключей и значений в хэше ..................................256
8.2.8. Копирование хэша в массив ........................................256
8.2.9. Выборка пар ключ-значение по заданному критерию .....256
8.2.10. Сортировка хэша .......................................................257
8.2.11. Объединение двух хэшей ...........................................257
8.2.12. Создание хэша из массива ........................................258
8.2.13. Вычисление разности и пересечения хэшей ..............258
8.2.14. Хэш как разреженная матрица ...................................258
8.2.15. Реализация хэша с повторяющимися ключами ..........259
8.2.16. Другие операции с хэшем ..........................................262
8.3. Перечисляемые структуры в общем....................................262
8.3.1. Метод inject .................................................................263
8.3.2. Кванторы .....................................................................264

Содержание
8.3.3. Метод partition .............................................................264
8.3.4. Обход с группировкой .................................................265
8.3.5. Преобразование в массив или множество ...................266
8.3.6. Перечислители ............................................................266
8.4. Дополнительные сведения о перечисляемых объектах .......268
8.4.1. Поиск и выборка ..........................................................268
8.4.2. Подсчет и сравнение ...................................................269
8.4.3. Итерирование .............................................................269
8.4.4. Извлечение и преобразование ....................................270
8.4.5. Ленивые перечислители ..............................................271
8.5. Заключение ........................................................................271

Глава 9. Более сложные структуры данных ................273
9.1. Множества .........................................................................273
9.1.1. Простые операции над множествами ..........................274
9.1.2. Более сложные операции над множествами ................275
9.2. Стеки и очереди .................................................................276
9.2.1. Более строгая реализация стека .................................278
9.2.2. Обнаружение несбалансированных скобок ..................278
9.2.3. Стек и рекурсия ...........................................................279
9.2.4. Более строгая реализация очереди .............................281
9.3. Деревья ..............................................................................282
9.3.1. Реализация двоичного дерева .....................................282
9.3.2. Сортировка с помощью двоичного дерева ...................284
9.3.3. Использование двоичного дерева как справочной  
таблицы ................................................................................286
9.3.4. Преобразование дерева в строку или массив ..............286
9.4. Графы .................................................................................287
9.4.1. Реализация графа в виде матрицы смежности ............288
9.4.2. Является ли граф связным? .........................................290
9.4.3. Есть ли в графе эйлеров цикл? .....................................292
9.4.4. Есть ли в графе эйлеров путь? .....................................293
9.4.5. Инструменты для работы с графами в Ruby .................293
9.5. Заключение ........................................................................293

Глава 10. Ввод-вывод и хранение данных ..................295
10.1. Файлы и каталоги .............................................................296
10.1.1. Открытие и закрытие файлов .....................................296
10.1.2. Обновление файла ....................................................298
10.1.3. Дописывание в конец файла ......................................298

Содержание
10.1.4. Прямой доступ к файлу ..............................................298
10.1.5. Работа с двоичными файлами ....................................299
10.1.6. Блокировка файлов ...................................................300
10.1.7. Простой ввод-вывод ..................................................301
10.1.8. Буферизованный и небуферизованный ввод-вывод.....302
10.1.9. Манипулирование правами владения  
и разрешениями на доступ к файлу .......................................303
10.1.10. Получение и установка временных меток .................304
10.1.11. Проверка существования и получение размера  
файла ...................................................................................305
10.1.12. Опрос специальных свойств файла ..........................306
10.1.13. Каналы .....................................................................308
10.1.14. Специальные операции ввода-вывода .....................309
10.1.15. Неблокирующий ввод-вывод ...................................310
10.1.16. Применение метода readpartial ................................311
10.1.17. Манипулирование путевыми именами .....................311
10.1.18. Класс Pathname .......................................................312
10.1.19. Манипулирование файлами на уровне команд .........313
10.1.20. Ввод символов с клавиатуры ...................................314
10.1.21. Чтение всего файла в память ...................................315
10.1.22. Построчное чтение из файла ....................................315
10.1.23. Побайтное и посимвольное чтение из файла ...........315
10.1.24. Работа со строкой как с файлом...............................316
10.1.25. Копирование потока ................................................316
10.1.26. Работа с кодировками ..............................................317
10.1.27. Чтение данных, встроенных в текст программы .......317
10.1.28. Чтение исходного текста программы .......................317
10.1.29. Работа с временными файлами ...............................318
10.1.30. Получение и изменение текущего каталога ..............318
10.1.31. Изменение текущего корня ......................................319
10.1.32. Обход каталога ........................................................319
10.1.33. Получение содержимого каталога ............................319
10.1.34. Создание цепочки каталогов ....................................319
10.1.35. Рекурсивное удаление каталога ...............................320
10.1.36. Поиск файлов и каталогов ........................................320
10.2. Доступ к данным более высокого уровня ..........................321
10.2.1. Простой маршалинг ...................................................321
10.2.2. «Глубокое копирование» с помощью метода Marshal .....322
10.2.3. Более сложный маршалинг ........................................322

Содержание
10.2.4. Маршалинг в формате YAML ......................................323
10.2.5. Сохранение данных с помощью библиотеки JSON .....325
10.2.6. Работа с данными в формате CSV ..............................326
10.2.7. SQLite3 как SQL-хранилище данных ...........................327
10.3. Подключение к внешним базам данных .............................328
10.3.1. Подключение к базе данных MySQL ...........................329
10.3.2. Подключение к базе данных PostreSQL ......................331
10.3.3. Объектно-реляционные отображения (ORM) .............332
10.3.4. Подключение к хранилищу данных Redis ....................333
10.4. Заключение ......................................................................334

Глава 11. ООП и динамические механизмы в Ruby .......335
11.1. Рутинные объектно-ориентированные задачи ..................336
11.1.1. Применение нескольких конструкторов .....................336
11.1.2. Создание атрибутов экземпляра ...............................337
11.1.3. Более сложные конструкторы ....................................339
11.1.4. Создание атрибутов и методов уровня класса ...........341
11.1.5. Наследование суперклассу ........................................344
11.1.6. Опрос класса объекта ................................................346
11.1.7. Проверка объектов на равенство ...............................348
11.1.8. Управление доступом к методам ...............................349
11.1.9. Копирование объектов...............................................352
11.1.10. Метод initialize_copy .................................................353
11.1.11. Метод allocate ..........................................................354
11.1.12. Модули ....................................................................354
11.1.13. Трансформация или преобразование объектов .......358
11.1.14. Классы, содержащие только данные (Struct) ............359
11.1.15. Замораживание объектов ........................................360
11.1.16. Использование метода tap в цепочке методов .........362
11.2. Более сложные механизмы ...............................................362
11.2.1. Посылка объекту явного сообщения ..........................363
11.2.2. Специализация отдельного объекта ..........................364
11.2.3. Вложенные классы и модули ......................................368
11.2.4. Создание параметрических классов ..........................368
11.2.5. Хранение кода в виде объектов Proc ..........................371
11.2.6. Хранение кода в виде объектов Method .....................372
11.2.7. Использование символов в качестве блоков ..............373
11.2.8. Как работает включение модулей? .............................373
11.2.9. Опознание параметров, заданных по умолчанию .......376
11.2.10. Делегирование или перенаправление .....................376

Содержание
11.2.11. Автоматическое определение методов чтения  
и установки на уровне класса ................................................379
11.2.12. Поддержка различных стилей программирования ...380
11.3. Динамические механизмы ................................................382
11.3.1. Динамическая интерпретация кода ...........................382
11.3.2. Метод const_get .........................................................383
11.3.3. Получение класса по имени .......................................384
11.3.4. Метод define_method .................................................384
11.3.5. Получение списка определенных сущностей .............387
11.3.6. Удаление определений ..............................................389
11.3.7. Ссылки на несуществующие константы .....................391
11.3.8. Вызовы несуществующих методов ............................392
11.3.9. Повышение безопасности с помощью taint ................393
11.3.10. Определение чистильщиков для объектов ...............395
11.4. Интроспекция программы ................................................396
11.4.1. Обход пространства объектов ...................................396
11.4.2. Просмотр стека вызовов ............................................397
11.4.3. Отслеживание изменений в определении класса 
или объекта...........................................................................398
11.4.4. Мониторинг выполнения программы .........................401
11.5. Заключение ......................................................................402

Глава 12. Графические интерфейсы для Ruby .............403
12.1. Shoes 4 .............................................................................404
12.1.1. Начало работы с Shoes ..............................................404
12.1.2. Интерактивная кнопка ...............................................405
12.1.3. Текст и поле ввода .....................................................405
12.1.4. Компоновка ...............................................................407
12.1.5. Картинки и фигуры ....................................................408
12.1.6. События.....................................................................409
12.1.7. Прочие замечания .....................................................410
12.2. Ruby/Tk .............................................................................410
12.2.1. Обзор ........................................................................410
12.2.2. Простое оконное приложение ....................................411
12.2.3. Кнопки .......................................................................413
12.2.4. Текстовые поля ..........................................................416
12.2.5. Прочие виджеты ........................................................420
12.2.6. Дополнительные замечания ......................................423
12.3. Ruby/GTK3 ........................................................................423

Содержание
12.3.1. Обзор ........................................................................423
12.3.2. Простое оконное приложение ....................................424
12.3.3. Кнопки .......................................................................425
12.3.4. Текстовые поля ..........................................................427
12.3.5. Прочие виджеты ........................................................429
12.3.6. Дополнительные замечания ......................................434
12.4. QtRuby ..............................................................................435
12.4.1. Обзор ........................................................................435
12.4.2. Простое оконное приложение ....................................435
12.4.3. Кнопки .......................................................................436
12.4.4. Текстовые поля ..........................................................438
12.4.5. Прочие виджеты ........................................................439
12.4.6. Дополнительные замечания ......................................444
12.5. Swing ................................................................................444
12.6. Другие библиотеки для создания графических  
интерфейсов .............................................................................446
12.6.1. UNIX и X11 ..................................................................446
12.6.2. FXRuby (FOX) ..............................................................446
12.6.3. RubyMotion для iOS и Mac OS X ..................................447
12.6.4. Windows Win32 API ......................................................447
12.7. Заключение ......................................................................447

Глава 13. Потоки и параллелизм ..............................448
13.1. Создание потоков и манипулирование ими .......................450
13.1.1. Создание потоков ......................................................450
13.1.2. Доступ к поточно-локальным переменным  ................451
13.1.3. Опрос и изменение состояния потока ........................452
13.1.4. Назначение рандеву (и получение возвращенного  
значения) ..............................................................................456
13.1.5. Обработка исключений ..............................................457
13.1.6. Группы потоков ..........................................................458
13.2. Синхронизация потоков ....................................................459
13.2.1. Простая синхронизация .............................................461
13.2.2. Синхронизация доступа с помощью мьютекса ...........462
13.2.3. Встроенные классы очередей ....................................464
13.2.4. Условные переменные ...............................................465
13.2.5. Другие способы синхронизации ................................467
13.2.6. Таймаут при выполнении операций ............................470
13.2.7. Ожидание события ....................................................472
13.2.8. Параллельный поиск в коллекции ..............................473
13.2.9. Параллельное рекурсивное удаление ........................474

Содержание
13.3. Волокна и кооперативная многозадачность ......................475
13.4. Заключение ......................................................................477

Глава 14. Скрипты и системное администрирование ...478
14.1. Запуск внешних программ ................................................478
14.1.1. Методы system и exec ................................................479
14.1.2. Запоминание вывода программы ..............................479
14.1.3. Манипулирование процессами ..................................480
14.1.4. Стандартный ввод и вывод ........................................483
14.2. Флаги и аргументы в командной строке ............................484
14.2.1. Константа ARGV .........................................................484
14.2.2. Константа ARGF .........................................................484
14.2.3. Разбор флагов в командной строке ...........................485
14.3. Библиотека Shell ...............................................................486
14.3.1. Использование библиотеки Shell  
для перенаправления ввода-вывода .....................................487
14.3.2. Дополнительные замечания по поводу  
библиотеки Shell ...................................................................488
14.4. Переменные окружения ....................................................489
14.4.1. Чтение и установка переменных окружения ...............489
14.4.2. Хранение переменных окружения в виде массива  
или хэша ...............................................................................490
14.5. Работа с файлами, каталогами и деревьями .....................491
14.5.1. Несколько слов о текстовых фильтрах ........................491
14.5.2. Копирование дерева каталогов (с символическими 
ссылками) .............................................................................491
14.5.3. Удаление файлов по времени модификации  
и другим критериям ..............................................................493
14.5.4. Вычисление свободного места на диске ....................494
14.6. Различные скрипты ...........................................................494
14.6.1. Распространение программ на Ruby ..........................494
14.6.2. Подача входных данных Ruby по конвейеру................495
14.6.3. Работает ли Ruby в интерактивном режиме? ..............496
14.6.4. Определение текущей платформы  
или операционной системы ..................................................497
14.6.5. Модуль Etc .................................................................497
14.7. Заключение ......................................................................498

Глава 15. Ruby и форматы данных ............................499
15.1. Разбор JSON ....................................................................500
15.1.1. Обход JSON-данных ..................................................500

Содержание
15.1.2. Типы данных, не представимые в JSON ......................501
15.1.3. Другие библиотеки для работы с JSON ......................502
15.2. Разбор XML (и HTML) ........................................................502
15.2.1. Разбор документа ......................................................503
15.2.2. Потоковый разбор .....................................................505
15.3. RSS и Atom........................................................................507
15.3.1. Разбор новостной ленты ............................................508
15.3.2. Создание новостных лент ..........................................509
15.4. Обработка изображений с помощью RMagick ...................510
15.4.1. Типичные графические задачи ...................................510
15.4.2. Специальные эффекты и преобразования .................513
15.4.3. API рисования ............................................................515
15.5. Создание документов в формате PDF с помощью  
библиотеки Prawn .....................................................................518
15.5.1. Основные концепции и приемы .................................519
15.5.2. Пример документа .....................................................519
15.6. Заключение ......................................................................523

Глава 16. Тестирование и отладка .............................524
16.1. Тестирование с помощью RSpec .......................................525
16.2. Тестирование с помощью Minitest .....................................527
16.3. Тестирование с помощью Cucumber .................................532
16.4. Работа с отладчиком byebug .............................................534
16.5. Отладка с помощью pry .....................................................537
16.6. Измерение производительности ......................................538
16.7. Объекты форматированной печати ...................................542
16.8. О том, что осталось за кадром ..........................................544
16.9. Заключение ......................................................................544

Глава 17. Создание пакетов и распространение  
программ ..........................................................546
17.1. Библиотеки и система Rubygems ......................................546
17.1.1. Работа с RubyGems ....................................................547
17.1.2. Создание gem-пакетов ..............................................547
17.2. Управление зависимостями с помощью Bundler ...............548
17.2.1. Семантическое версионирование ..............................550
17.2.2. Загрузка зависимостей из Git ....................................550
17.2.3. Создание gem-пакетов с помощью Bundler ................551
17.2.4. Частные gem-пакеты .................................................551
17.3. Программа RDoc ..............................................................552

Содержание
17.3.1. Простая разметка ......................................................554
17.3.2. Создание улучшенной документации с помощью  
Yard .......................................................................................556
17.4. Заключение ......................................................................557

Глава 18. Сетевое программирование .......................558
18.1. Сетевые серверы ..............................................................560
18.1.1. Простой сервер: время дня ........................................560
18.1.2. Реализация многопоточного сервера ........................561
18.1.3. Пример: сервер для игры в шахматы по сети .............562
18.2. Сетевые клиенты ..............................................................569
18.2.1. Получение истинно случайных чисел из веб ...............570
18.2.2. Запрос к официальному серверу времени .................573
18.2.3. Взаимодействие с POP-сервером .............................573
18.2.4. Отправка почты по протоколу SMTP ...........................575
18.2.5. Взаимодействие с IMAP-сервером ............................578
18.2.6. Кодирование и декодирование вложений ..................579
18.2.7. Пример: шлюз между почтой и конференциями .........581
18.2.8. Получение веб-страницы с известным URL ................586
18.2.9. Библиотека Open-URI ................................................587
18.3. Заключение ......................................................................588

Глава 19. Ruby и веб-приложения .............................589
19.1. HTTP-серверы ..................................................................589
19.1.1. Простой HTTP-сервер ................................................589
19.1.2. Rack и веб-серверы ...................................................591
19.2. Каркасы приложений ........................................................593
19.2.1. Маршрутизация в Sinatra ...........................................594
19.2.2. Маршрутизация в Rails ...............................................595
19.2.3. Параметры в Sinatra ...................................................597
19.2.4. Параметры в Rails ......................................................598
19.3. Хранение данных ..............................................................599
19.3.1. Базы данных ..............................................................599
19.3.2. Хранилища данных ....................................................601
19.4. Генерация HTML ................................................................602
19.4.1. ERB ............................................................................602
19.4.2. Haml ..........................................................................604
19.4.3. Другие шаблонные системы ......................................605
19.5. Конвейер активов .............................................................605
19.5.1. CSS и Sass .................................................................606

Содержание
19.5.2. JavaScript и CoffeeScript.............................................607
19.6. Предоставление веб-служб по протоколу HTTP ................609
19.6.1. Использование JSON в API .........................................610
19.6.2. REST API и его вариации ............................................610
19.7. Генерация статических сайтов ..........................................611
19.7.1. Middleman ..................................................................612
19.7.2. Другие генераторы статических сайтов .....................613
19.8. Заключение ......................................................................613

Глава 20. Распределенный Ruby ...............................614
20.1. Обзор: библиотека drb ......................................................614
20.2. Пример: эмуляция биржевой ленты ..................................617
20.3. Rinda: пространство кортежей в Ruby ...............................620
20.4. Обнаружение служб в распределенном Ruby ....................624
20.5. Заключение ......................................................................625

Глава 21. Инструменты разработки для Ruby ..............626
21.1. Программа Rake ...............................................................626
21.2. Оболочка irb ......................................................................630
21.3. Основы pry ........................................................................634
21.4. Утилита ri ..........................................................................635
21.5. Поддержка со стороны редакторов ...................................635
21.5.1. Vim .............................................................................636
21.5.2. Emacs ........................................................................637
21.6. Менеджеры версий Ruby ..................................................637
21.6.1. Работа с rvm ..............................................................637
21.6.2. Работа с rbenv ............................................................638
21.6.3. Работа с chruby ..........................................................639
21.7. Заключение ......................................................................639

Глава 22. Сообщество пользователей Ruby ................640
22.1. Ресурсы в веб ...................................................................640
22.2. Новостные группы и списки рассылки ...............................640
22.3. Извещения об ошибках и предложения новых функций ....641
22.4. Каналы IRC .......................................................................641
22.5. Конференции по Ruby .......................................................642
22.6. Локальные группы пользователей Ruby ............................643
22.7. Заключение ......................................................................643

Предметный указатель ...........................................644

Содержание
Предисловие

Предисловие к третьему изданию

Вчера я читал статью на сайте Wired.com о моде в среде компьютерных фриков. 
Так там пишут, что если человек носит футболку с надписью Rubyconf 2012, значит, 
он хочет сообщить «Я работаю в Oracle».
Ну надо же! Далеко же мы ушли за последние 10 лет!
Было время, когда Ruby определенно выбивался из господствующих тенденций. 
Но теперь мы, похоже, в струе. Однако для этого пришлось пройти долгий 
и необычный путь.
По нынешним стандартам, чтобы войти в обиход, Ruby потребовалось много 
времени. Я читал эту книгу в 2005 году, и уже тогда первому изданию исполнилось 
четыре года. Тогда только-только намечался второй всплеск интереса к Ruby благодаря 
DHH и началу повальной увлеченности Rails. Казалось, что во всем англоговорящем 
мире не наберется и двух сотен человек, использующих Ruby. А первому 
изданию книги уже было четыре года. Вот насколько она опередила свое время.
В новом издании книги сохранен стиль, завоевавший ей признание у опытных 
программистов. В первых четырех длинных главах описываются основы объектно-
ориентированного подхода и самого языка Ruby. Их обязательно должен 
прочитать всякий, кто не знаком с языком. Но изложение стремительное, без задержки 
на деталях – предполагается, что читатель уже знает, как создается программное 
обеспечение.
Последующие главы устроены иначе. Краткая предыстория, а затем мощный 
залп сведений о языке Ruby. Для иллюстрации обсуждаемой темы приводятся 
многочисленные фрагменты кода. Примеры можно вставлять в собственные программы 
практически без изменений – особенно когда вы дойдете до глав, в которых 
рассматриваются практические приложения.
Будет уместно сказать пару слов о себе. Я очень благодарен Хэлу за эту книгу 
и за то, как именно он ее написал. В 2005 году по договору с издательством Addison 
Wesley я начал работать над книгой об использовании Ruby on Rails на предприятии. 
То была моя первая попытка попробовать себя в роли автора и, сочинив две 
главы, я застрял. В то время Ruby и Rails можно было встретить на предприятиях 
лишь эпизодически, и я должен был постоянно напоминать себе, что пишу не 
беллетристику.
Обсудив варианты с редактором, мы решили, что будет правильнее отказаться 
от первоначальной идеи и подойти к книге по-другому. Книга «Путь Rails» стала попыткой 
осветить только зарождающийся каркас Ruby on Rails в духе, присущем этой 
Предисловие ко второму изданию

книге. Я взял на вооружение краткий повествовательный стиль с изобилием примеров 
кода. Вместо длинных листингов я чередовал код и комментарии, стремясь не 
переусердствовать, а просто проиллюстрировать смысл отдельных частей каркаса.
Как и в «Пути Ruby», я ставил себе целью добиться ширины охвата, а не глубины 
рассмотрения. Я хотел, чтобы «Путь Rails» занял постоянное место на столах 
серьезных разработчиков приложений под Rails. Я хотел, чтобы моя книга, как 
и «Путь Ruby», стала справочным пособием по умолчанию. В отличие от других 
книг по Rails, я полностью опустил вводный материал и проигнорировал интересы 
начинающих.
И это был успех! Будет справедливо сказать, что без книги Хэла не было бы 
и моей книги, а моя карьера сложилась бы не так удачно.
Но довольно ретроспективных поздравлений. Вернемся к дню сегодняшнему 
и только что вышедшему изданию «Пути Ruby», которое вы сейчас читаете. 
На этот раз к Хэлу присоединился безмерно талантливый Андрэ Арко1. Отличная 
получилась команда! Изрядно потрудившись, они привели текст в соответствие 
с последней версией всеми нами любимого языка Ruby.
Лично я хотел бы отметить следующие отличия от предыдущих изданий.
• Целая глава, посвященная углубленному рассмотрению новой подсистемы 
регулярных выражений Onigmo. Мне очень нравятся их красивые и краткие 
объяснения таких концепций, как позитивное и негативное заглядывание 
и оглядывание.

• В главе об интернационализации обсуждаются трудные вопросы, касающиеся 
кодировки объектов типа String и нормализации в Unicode. Блогеры 
уже много лет обсуждают различные аспекты этой темы, но наконец-то все 
собрано в одном месте.

• В главе о приложениях Ruby в веб авторам удалось соединить в одном кратком 
курсе, занимающем меньше 30 страниц, начальные сведения о Rack, 
Sinatra и Rails.

Я предсказываю этому изданию «Пути Ruby»  не меньший успех, чем предыдущим. 
С удовольствием включаю его в нашу серию книг «Professional Ruby».

Оби Фернандес
15 сентября 2014

Предисловие ко второму изданию
В древнем Китае люди, в особенности философы, полагали, что под внешней оболочкой 
мира и любого существа скрыто нечто. Его нельзя ни объяснить, ни описать 
словами. Это нечто китайцы называли Тао, а японцы – До. На русский язык 
это слово можно перевести как Путь. Слово «до» входит в такие названия, как 

1 Желаете увидеть пример изобретательности Андрэ? Почитайте статью по адресу http://andre.arko.
net/2014/06/27/rails-in-05-seconds/, где он описывает, как уменьшить время загрузки реального 
приложения Rails до 500 мс, а то и меньше.
Предисловие к первому изданию

дзюдо, кендо, карате-до и айкидо. Это не просто боевые искусства, а целая философия 
и взгляд на жизнь.
Так и в языке программирования Ruby есть своя философия и способ мышления. 
Этот язык заставляет думать по-новому. Он помогает программистам получать 
удовольствие от своей работы. И не потому, что Ruby был создан в Японии, 
а потому что программирование стало важной частью существования (по крайней 
мере, для некоторых людей), а Ruby призван улучшить жизнь.
Как всегда, описать, что такое Тао, трудно. Я чувствую, но не могу подыскать 
нужных слов. Это трудно сделать даже на японском, моем родном языке. Но парень 
по имени Хэл Фултон попытался, и его первая попытка (первое издание этой 
книги) оказалась довольно удачной. А результат второго подхода к задаче описать 
Тао Rubi еще лучше, чему немало способствовала помощь многих людей из сообщества 
пользователей Ruby. По мере того как Ruby набирает популярность (отчасти 
благодаря продукту Ruby on Rails), все важнее становится овладение секретами 
мастерства производительного программирования на этом языке. Надеюсь, 
что эта книга поможет вам в решении этой задачи.
Удачной работы.
Юкихиро «Мац» Мацумото
Август 2006, Япония

Предисловие к первому изданию
Вскоре после того, как я впервые познакомился с компьютерами в начале 1980-х годов, 
меня заинтересовали языки программирования. И с тех пор я помешался на 
этой теме. Думаю, что причина такого интереса состоит в том, что языки программирования – 
это способ выражения мыслей. Они по сути своей предназначены для 
человека.
Но вопреки этому факту языки программирования почему-то всегда оказывались 
в большей степени машинно-ориентированными. Многие из них спроектированы 
с учетом удобства для компьютеров.
По мере того как компьютеры становятся мощнее и дешевле, ситуация постепенно 
меняется. Возьмем к примеру структурное программирование. Машине все 
равно, насколько хорошо структурирована программа, она просто исполняет ее 
команда за командой. Идеи структурного программирования обращены к людям, 
а не к машинам. То же относится и к объектно-ориентированному программированию.

Пришло время проектировать языки, удобные для людей.
В 1993 году я разговаривал со своим коллегой о сценарных языках, их выразительности 
и перспективах. Я считал, что программирование пойдет именно по этому 
пути и будет ориентироваться на человека.
Но я не был удовлетворен такими существующими языками, как Perl и Python. 
Я хотел видеть язык, более мощный, чем Perl, и более объектно-ориентированный, 
чем Python. Найти идеальный язык мне не удалось, поэтому я решил изобрести 
свой собственный.
Предисловие ко второму изданию

Ruby – не самый простой язык, но и человеческая душа не проста. Ей равно 
нравятся простота и сложность. Она не приемлет ни слишком простых, ни слишком 
сложных вещей. Она ищет равновесия.
Поэтому при проектировании ориентированного на человека языка – Ruby – 
я следовал принципу наименьшего удивления. Я считал, что хорошо то, что не кажется 
мне странным. Поэтому я ощущаю себя естественно и даже испытываю радость, 
когда программирую на Ruby. А с момента выхода в свет первой версии 
в 1995 году многие программисты во всем мире разделили со мной эту радость.
Как всегда, я хочу выразить величайшую благодарность всем членам сообщества, 
сложившегося вокруг Ruby. Они – причина успеха Ruby.
Я благодарен также автору этой книги, Хэлу Фултону за то, что он показал другим 
Путь Ruby.
В этой книге объясняется философия, стоящая за языком Ruby. Это квинтэссенция 
моих мыслей и ощущений членов сообщества. Интересно, как Хэлу удалось 
прочитать мои мысли и раскрыть секрет Пути Ruby. Я никогда не встречался 
с ним лично, надеюсь, что скоро это все-таки произойдет.
Я хотел бы, чтобы эта книга и сам язык Ruby помогли вам получить удовольствие 
и радость от программирования.
Юкихиро «Мац» Мацумото
Сентябрь 2001, Япония
Благодарности

Благодарности за третье издание
Теперь нас уже не удивляет, что процесс переработки книги в ходе подготовки третьего 
издания оказался тяжким трудом. Со времени версии 1.8 Ruby претерпел существенные 
изменения, а быть программистом на Ruby теперь куда престижнее, чем раньше.
Проверка, дополнение и переработка книги заняли гораздо больше времени, 
чем предполагалось. Сменились аж три версии Ruby – 1.9, 2.0 и 2.1 – и столько же 
раз редактировалась и переписывалась эта книга.
Ее выходу поспособствовали многие люди. В издательстве Addison-Wesley помощь 
и поддержку оказывали Дебра Уильямс Коули (Debra Williams Cauley), 
Соньлин Киу (Songlin Qiu), Энди Бистер (Andy Beaster) и Барт Рид (Bart Reed). 
А вклад Русса Олсена (Russ Olsen) и Андрэ Арко поистине бесценен.
Техническими редакторами книги стали Русс Олсен и Стив Клэбник (Steve 
Klabnik), благодаря их замечаниям и предложениям текст стал точнее и понятнее. 
Русс предоставил также библиотеки и скрипты на Ruby для компиляции самого 
текста книги. Как обычно, за все ошибки несу ответственность я, а не они.
Советы, примеры коды, а также просто полезные пояснения предлагали также 
Дэйв Томас (Dave Thomas), Дэвид Алан Блэк (David Alan Black), Эрик Ходел (Eric 
Hodel),  Чэд Файлер (Chad Fowler), Брэд Эдигер (Brad Ediger), Свен Фукс (Sven 
Fuchs), Джесси Стоример (Jesse Storimer), Люк Франкль (Luke Francl) и другие.
Отдельное спасибо Полу Харрисону (Paul Harrison) и другим моим коллегам 
по компании Simpli.fi за поддержку и ободрение.
Хочу также почтить память Гая Декукса (Guy Decoux) и недавно ушедшего от 
нас Джима Вейриха (Jim Weirich). Джим в особенности сделал очень много как 
для этой книги, так и для сообщества в целом.
И как всегда, в заключение приношу благодарность самому Мацу за создание 
Ruby, и тебе, читатель этой книги. Надеюсь, что она сможет чему-то научить, 
о чем-то рассказать, а то и позабавить тебя.

Благодарности за второе издание
Здравый смысл подсказывает, что второе издание требует в два раза меньше работы, 
чем первое. Но здравый смысл ошибается.
Хотя значительная часть текста этой книги перекочевала прямиком из первого 
издания, даже эту часть пришлось сильно править. Для каждого предложения 
задавался вопрос: «Сохранилось ли в 2006 году то, что было верно в 2001?» И это 
только начало.
Доступ онлайн
799 ₽
В корзину