Предисловие 13
Цель книги 13
Как создавалась книга... 13
Терминология 14
Исходные коды 14
Задания 15
Типографские соглашения 15
Благодарности 16
Глава 1. Введение в язык Ruby
19
1.1. Философия Ruby 19
1.2. Реализации Ruby 21
1.3. Версии 23
1.4. Установка Ruby 24
1.4.1. Установка Ruby в Windows 24
1.4.2. Установка Ruby в Linux (Ubuntu) 26
1.4.2.1. Менеджер версий RVM 26
1.4.2.2. Менеджер версий rbenv 28
1.4.3. Установка Ruby в macOS 29
1.5. Запуск программы на выполнение 30
Задания 31
Глава 2. Быстрый старт
33
2.1. Соглашения Ruby 33
2.2. Комментарии 34
2.3. Элементы языка 35
2.3.1. Ключевые слова 36
2.3.2. Переменные 37
2.3.3. Константы 37
2.3.4. Объекты 38
2.3.5. Классы и модули 39
2.3.6. Методы 40
2.3.7. Операторы 40
2.4. Вывод в стандартный поток 41
2.4.1. Вывод при помощи методов puts и p 41
2.4.2. Экранирование 42
2.5. Как пользоваться документацией? 43
2.5.1. Справочные методы объектов 44
2.5.2. Консольная справка 45
2.5.3. Online-документация 46
Задания 46
Глава 3. Утилиты и гемы
47
3.1. Утилиты 47
3.2. Интерактивный Ruby 48
3.3. Шаблонизатор erb 50
3.4. Утилита rake 50
3.5. Утилита rdoc 53
3.6. Гемы 54
3.6.1. Отладка программ при помощи гема pry 56
3.6.2. Контроль стиля кода при помощи гема rubocop 57
3.6.3. Управление гемами при помощи bundler 58
Задания 63
Глава 4. Предопределенные классы
65
4.1. Синтаксические конструкторы 65
4.2. Строки. Класс String 67
4.2.1. Синтаксические конструкторы %q и %Q 67
4.2.2. Heredoc-оператор 68
4.2.3. Выполнение команд операционной системы 69
4.2.4. Устройство строки 70
4.2.5. Обработка подстрок 71
4.3. Символы. Класс Symbol 73
4.4. Целые числа. Класс Integer 74
4.5. Вещественные числа. Класс Float 76
4.6. Диапазоны. Класс Range 79
4.7. Массивы. Класс Array 81
4.7.1. Создание массива 81
4.7.2. Операции с массивами 81
4.7.3. Синтаксические конструкторы %w и %i 82
4.8. Хэши. Класс Hash 83
4.9. Логические объекты true и false 84
4.10. Объект nil 85
Задания 85
Глава 5. Переменные
87
5.1. Типы переменных 87
5.1.1. Локальные переменные 87
5.1.2. Глобальные переменные 89
5.1.2.1. Предопределенная переменная $LOAD_PATH 91
5.1.2.2. Предопределенная переменная $stdout 91
5.1.2.3. Предопределенная переменная $PROGRAM_NAME 92
5.1.3. Инстанс-переменные 93
5.1.4. Переменные класса 96
5.2. Присваивание 97
5.3. Клонирование 99
Задания 101
Глава 6. Константы
103
6.1. Создание и определение констант 103
6.2. Предопределенные константы 104
6.3. Ключевые слова __LINE__ и __FILE__ 107
6.4. Метод require 107
6.5. Метод require_relative 109
6.6. Подключение стандартных классов 110
6.7. Подключение гемов 111
Задания 113
Глава 7. Операторы
115
7.1. Операторы — это методы 115
7.2. Арифметические операторы 116
7.3. Присваивание 117
7.3.1. Сокращенная форма арифметических операторов 117
7.3.2. Параллельное присваивание 118
7.3.3. Круглые скобки в параллельном присваивании 119
7.3.4. Оператор * 120
7.4. Операторы строк 122
7.4.1. Умножение строки на число 122
7.4.2. Сложение строк 123
7.4.3. Форматирование строк 124
7.5. Операторы сравнения 128
7.5.1. Особенности сравнения объектов 129
7.5.2. Сравнение с нулем 131
7.5.3. Особенности сравнения вещественных чисел 132
7.5.4. Особенности сравнения строк 132
7.6. Поразрядные операторы 134
7.7. Оператор безопасного вызова 138
7.8. Ключевое слово defined? 139
7.9. Приоритет операторов 140
Задания 141
Глава 8. Ветвление
143
8.1. Ключевое слово if 143
8.1.1. Ключевые слова else и elsif 145
8.1.2. Ключевое слово then 146
8.1.3. if-модификатор 147
8.1.4. Присваивание if-результата переменной 148
8.1.5. Присваивание в условии if-оператора 149
8.2. Логические операторы 150
8.2.1. Логическое И. Оператор && 151
8.2.2. Логическое ИЛИ. Оператор || 151
8.2.3. Логическое отрицание 154
8.3. Ключевое слово unless 155
8.4. Условный оператор 156
8.5. Ключевое слово case 156
8.6. Советы 159
Задания 161
Глава 9. Глобальные методы
163
9.1. Создание метода 163
9.2. Параметры и аргументы 164
9.2.1. Значения по умолчанию 165
9.2.2. Неограниченное количество параметров 165
9.2.3. Позиционные параметры 167
9.2.4. Хэши в качестве параметров 167
9.3. Возвращаемое значение 168
9.4. Получатель метода 170
9.5. Псевдонимы методов 172
9.6. Удаление метода 172
9.7. Рекурсивные методы 172
9.8. Предопределенные методы 175
9.8.1. Чтение входного потока 175
9.8.2. Остановка программы 177
9.8.3. Методы-конструкторы 179
9.9. Логические методы 180
9.10. bang-методы 181
Задания 182
Глава 10. Циклы
183
10.1. Цикл while 183
10.2. Вложенные циклы 188
10.3. Досрочное прекращение циклов 189
10.4. Цикл until 191
10.5. Цикл for 192
Задания 193
Глава 11. Итераторы
195
11.1. Итераторы и блоки 195
11.2. Обход итераторами массивов и хэшей 196
11.3. Итератор times 197
11.4. Итераторы upto и downto 198
11.5. Итераторы коллекций 198
11.5.1. Итератор each 199
11.5.2. Итератор each_with_index 200
11.5.3. Итератор map 200
11.5.4. Итераторы select и reject 201
11.5.5. Итератор reduce 203
11.5.6. Итератор each_with_object 204
11.6. Итератор tap 205
11.7. Сокращенная форма итераторов 207
11.8. Досрочное прекращение итерации 207
11.9. Класс Enumerator 209
Задания 210
Глава 12. Блоки
211
12.1. Блоки в собственных методах 211
12.2. Передача значений в блок 213
12.3. Метод block_given? 215
12.4. Возврат значений из блока 215
12.5. Итератор yield_self 216
12.6. Передача блока через параметр 217
12.7. Различие { ... } и do ... end 219
12.8. Блоки в рекурсивных методах 221
12.9. Класс Proc 225
12.10. Методы proc и lambda 226
12.11. Различия proc и lambda 227
Задания 230
Глава 13. Классы
231
13.1. Создание класса 231
13.2. Класс — это объект 232
13.3. Как проектировать классы? 234
13.4. Переопределение методов 234
13.5. Открытие класса 235
13.6. Тело класса и его свойства 237
13.7. Вложенные классы 238
13.8. Константы 240
13.9. Переменные класса 241
Задания 243
Глава 14. Методы в классах
245
14.1. Сохранение состояния в объекте 245
14.2. Установка начального состояния объекта 246
14.2.1. Метод initialize 247
14.2.2. Параметры метода new 250
14.2.3. Блоки в методе new 254
14.2.4. Метод initialize и переменные класса 255
14.2.5. Как устроен метод new? 255
14.3. Специальные методы присваивания 256
14.3.1. Методы со знаком равенства (=) в конце имени 257
14.3.2. Аксессоры 259
14.4. Синглетон-методы 261
14.5. Методы класса 264
14.6. Обработка несуществующих методов 266
14.6.1. Создание метода define_method 267
14.6.2. Перехват вызовов несуществующих методов 268
14.7. Метод send 270
Задания 275
Глава 15. Преобразование объектов
277
15.1. Сложение строк и чисел 277
15.2. Методы преобразования объектов 278
15.3. Сложение объектов 282
15.4. Сложение объекта и числа 283
15.5. Сложение объекта и строки 286
15.6. Сложение объекта и массива 289
15.7. Перегрузка [] и []= 291
15.8. Перегрузка унарных операторов +, – и ! 294
15.9. Какие операторы можно перегружать? 295
15.10. DuckType-типизация 297
Задания 300
Глава 16. Ключевое слово self
301
16.1. Ссылки на текущий объект 301
16.2. Значения self в разных контекстах 304
16.3. Приемы использования self 305
16.3.1. Методы класса 305
16.3.2. Цепочка обязанностей 308
16.3.3. Перегрузка операторов 309
16.3.4. Инициализация объекта блоком 310
16.3.5. Открытие класса 310
Задания 311
Глава 17. Наследование
313
17.1. Наследование 313
17.2. Логические операторы 316
17.3. Динамический базовый класс 317
17.4. Наследование констант 318
17.5. Иерархия стандартных классов 319
17.6. Переопределение методов 320
17.7. Удаление методов 322
17.8. Поиск метода 326
Задания 328
Глава 18. Области видимости
331
18.1. Концепция видимости 331
18.2. Открытые методы 332
18.3. Закрытые методы 333
18.4. Защищенные методы 335
18.5. Закрытый конструктор 337
18.6. Паттерн «Одиночка» (Singleton) 338
18.7. Вызов закрытых методов 341
18.8. Информационные методы 342
18.9. Области видимости при наследовании 345
18.10. Области видимости методов класса 346
Задания 348
Глава 19. Модули
349
19.1. Создание модуля 349
19.2. Оператор разрешения области видимости 350
19.3. Пространство имен 351
19.4. Вложенные классы и модули 352
19.5. Доступ к глобальным классам и модулям 357
Задания 361
Глава 20. Подмешивание модулей
363
20.1. Класс Module 363
20.2. Подмешивание модулей в класс 365
20.3. Подмешивание модулей в объект 369
20.4. Синглетон-методы модуля 373
20.5. Области видимости 376
20.6. Стандартный модуль Kernel 379
20.7. Поиск методов в модулях 382
20.8. Метод prepend 386
20.9. Методы обратного вызова 387
20.10. Уточнения 393
20.11. Псевдонимы методов 395
Задания 397
Глава 21. Стандартные модули
399
21.1. Модуль Math 399
21.2. Модуль Singleton 402
21.3. Модуль Comparable 404
21.4. Модуль Enumerable 406
21.5. Модуль Forwardable 408
21.6. Маршаллизация 413
21.7. JSON-формат 416
21.8. YAML-формат 418
Задания 421
Глава 22. Свойства объектов
423
22.1. Общие методы 423
22.2. Неизменяемые объекты 424
22.3. Заморозка объектов 425
22.4. Небезопасные объекты 426
Задания 428
Глава 23. Массивы
429
23.1. Модуль Enumerable 429
23.2. Заполнение массива 430
23.3. Извлечение элементов 434
23.4. Поиск индексов элементов 439
23.5. Случайный элемент массива 439
23.6. Удаление элементов 440
23.7. Замена элементов 443
23.8. Информация о массиве 445
23.9. Преобразование массива 446
23.10. Арифметические операции с массивами 447
23.11. Логические методы 448
23.12. Вложенные массивы 451
23.13. Итераторы 453
23.14. Сортировка массивов 455
Задания 456
Глава 24. Хэши
457
24.1. Создание хэша 457
24.2. Заполнение хэша 458
24.3. Извлечение элементов 459
24.4. Поиск ключа 461
24.5. Обращение к несуществующему ключу 461
24.6. Удаление элементов хэша 463
24.7. Информация о хэшах 465
24.8. Хэши как аргументы методов 467
24.9. Объединение хэшей 468
24.10. Преобразование хэшей 468
24.11. Сравнение ключей 471
24.12. Преобразование ключей хэша 474
Задания 477
Глава 25. Классы коллекций
479
25.1. Множество Set 479
25.2. Класс Struct 485
25.3. Класс OpenStruct 489
Задания 490
Глава 26. Исключения
493
26.1. Генерация и перехват исключений 493
26.2. Исключения — это объекты 496
26.3. Стандартные ошибки 497
26.4. Создание собственных исключений 498
26.5. Перехват исключений 500
26.6. Многократная попытка выполнить код 501
26.7. Перехват исключений: почти всегда плохо 502
26.8. Блок ensure 502
26.9. Блок else 503
26.10. Перехват исключений в блоке 504
Задания 504
Глава 27. Файлы
505
27.1. Класс IO 505
27.2. Создание файла 506
27.3. Режимы открытия файла 508
27.4. Закрытие файла 510
27.5. Чтение содержимого файла 512
27.6. Построчное чтение файла 512
27.7. Запись в файл 515
27.8. Произвольный доступ к файлу 517
27.9. Пути к файлам 520
27.10. Манипуляция файлами 522
Задания 523
Глава 28. Права доступа и атрибуты файлов
525
28.1. Типы файлов 525
28.2. Определение типа файла 529
28.3. Время последнего доступа к файлу 529
28.4. Права доступа в UNIX-подобной системе 531
Задания 534
Глава 29. Каталоги
535
29.1. Текущий каталог 535
29.2. Создание каталога 536
29.3. Чтение каталога 537
29.4. Фильтрация содержимого каталога 538
29.5. Рекурсивный обход каталога 539
29.6. Удаление каталога 542
Задания 542
Глава 30. Регулярные выражения
543
30.1. Как изучать регулярные выражения? 543
30.2. Синтаксический конструктор 544
30.3. Оператор =~ 545
30.4. Методы поиска 546
30.4.1. Метод match 546
30.4.2. Метод match? 547
30.4.3. Метод scan 548
30.5. Синтаксис регулярных выражений 548
30.5.1. Метасимволы 548
30.5.2. Экранирование 553
30.5.3. Квантификаторы 554
30.5.4. Опережающие и ретроспективные проверки 556
30.6. Модификаторы 557
30.7. Где использовать регулярные выражения? 560
30.8. Примеры 562
Задания 565
Глава 31. Веб-программирование
567
31.1. Протокол HTTP 567
31.1.1. HTTP-заголовки 570
31.1.2. HTTP-коды ответа 570
31.2. Веб-серверы 571
31.3. Гем Rack 572
31.3.1. Установка гема Rack 574
31.3.2. Простейшее Rack-приложение 574
31.3.3. Управление утилитой rackup 578
31.3.4. Обработка несуществующих страниц 579
31.3.5. Размер HTTP-содержимого 580
31.3.6. Proc-объект в качестве Rack-приложения 582
31.3.7. Промежуточные слои (middleware) 582
31.3.8. Роутинг 583
31.3.9. Обработка статических файлов 584
31.4. Ruby on Rails 587
31.4.1. Введение в Ruby on Rails 587
31.4.2. Установка Ruby on Rails 588
31.4.3. Паттерн MVC 591
31.4.4. Структура приложения Ruby on Rails 594
31.4.4.1. Каталог app 595
31.4.4.2. Окружения 595
31.4.4.3. Каталог config 596
31.4.4.4. Каталог db 596
31.4.4.5. Каталог lib 596
31.4.4.6. Каталог public 597
31.4.4.7. Каталог test 597
31.4.5. Rake-задачи 597
31.4.6. Генераторы 599
31.4.7. Стартовая страница 601
31.4.8. Представления 604
Задания 606
Глава 32. Автоматическое тестирование
607
32.1. Типы тестирования 607
32.2. Преимущества и недостатки тестирования 608
32.3. Фреймворки для тестирования 609
32.3.1. Фреймворк MiniTest 609
32.3.2. Фреймворк RSpec 613
32.3.3. Фреймворк Cucumber 620
Задания 624

Заключение 625
Приложение 1. Справочные таблицы 627
П1.1. Ключевые слова 627
П1.2. Синтаксические конструкторы 628
П1.3. Экранирование 629
П1.4. Переменные и константы 629
П1.5. Операторы 632
П1.6. Конструкции ветвления и циклы 635
П1.7. Итераторы 635
Приложение 2. Содержимое электронного архива 637
Предметный указатель 639