Путь Ruby
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Перевод:
Слинкин Алексей Александрович
Год издания: 2023
Кол-во страниц: 666
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Дополнительное образование
ISBN: 978-5-89818-334-9
Артикул: 816356.01.99
Доступ онлайн
В корзину
Уже больше десяти лет программисты на Ruby обращаются к данной книге как к надежному источнику сведений о том, как эффективно писать на этом языке. А теперь Хэл Фултон и Андрэ Арко изрядно обновили этот классический труд, включив описание новых средств языка и инструментов. Новое издание охватывает версию Ruby 2.1 и содержит более 400 примеров, отвечающих на вопрос «Как это делается в Ruby?». Все примеры сопровождаются подробным описанием задачи и технических ограничений. Затем дается пошаговое объяснение одного хорошего решения с детальными комментариями, позволяющими лучше усвоить материал. Третье издание удобно организовано по темам, так что стало еще проще найти ответ на свой вопрос и писать более качественный код в согласии с духом и философией Ruby.
- Полная коллекция по информатике и вычислительной технике
- ДМК Пресс. Информационные системы и технологии
- ДМК Пресс. ИТ-технологии для профессионалов
- Интермедиатор. Информационные системы и технологии (сводная)
- Интермедиатор. ИТ-технологии для профессионалов (сводная)
- Программирование
- Программирование и алгоритмизация
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Хэл Фултон совместно с Андрэ Арко Путь 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?» И это только начало.
Доступ онлайн
В корзину