УДК 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
Стр.5
Содержание
Предисловие ......................................................... 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
Стр.7
Содержание
7
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
Стр.8
8
Содержание
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
Стр.9
Содержание
9
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
Стр.10
10
Содержание
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. Вычисление промежутка времени, прошедшего
Стр.11
Содержание
11
от точки отсчета ........................................................................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
Стр.12
12
Содержание
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
Стр.13
Содержание
13
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
Стр.14
14
Содержание
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
Стр.15
Содержание
15
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
Стр.16
16
Содержание
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
Стр.17
Содержание
17
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
Стр.18
18
Содержание
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
Стр.19
Содержание
19
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
Стр.20
20
Содержание
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
Стр.21
Содержание
21
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
Стр.22