Предисловие |
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 |
|