Часть II. Основные данные………………………………………………………. 101
Глава 4. Структуры данных…………………………………………………………………. 103
4.1. Строковые типы String, str, &str и &’static str…………………………………………………………………. 104
4.1.1. Сравнение String и str…………………………………………………………………………………………….. 104
4.1.2. Эффективное применение строк……………………………………………………………………………. 105
4.2. Что такое слайсы и массивы?………………………………………………………………………………………….. 108
4.3. Векторы……………………………………………………………………………………………………………………………… 111
4.3.1. Более глубокое погружение в Vec…………………………………………………………………………. 111
4.3.2. Обертывание векторов…………………………………………………………………………………………… 113
4.3.3. Типы, связанные с векторами………………………………………………………………………………… 113
4.4. Отображения……………………………………………………………………………………………………………………… 114
4.4.1. Пользовательские функции хеширования……………………………………………………………. 115
4.4.2. Создание хешируемых типов………………………………………………………………………………… 116
4.5. Типы Rust: примитивы, структуры, перечисления и псевдонимы………………………………… 117
4.5.1. Применение примитивных типов………………………………………………………………………….. 117
Целочисленные типы…………………………………………………………………………………………….. 118
Размерные типы…………………………………………………………………………………………………….. 119
Арифметика на примитивных типах……………………………………………………………………. 119
4.5.2. Использование кортежей……………………………………………………………………………………….. 121
4.5.3. Применение структур…………………………………………………………………………………………….. 122
4.5.4. Применение перечислений…………………………………………………………………………………….. 125
4.5.5. Применение псевдонимов………………………………………………………………………………………. 128
4.6. Обработка ошибок с помощью Result…………………………………………………………………………….. 129
4.7. Преобразование типов с помощью From/Into………………………………………………………………… 130
4.7.1. Типажи TryFrom и TryInto……………………………………………………………………………………… 132
4.7.2. Наиболее рациональные приемы преобразования типов с использованием From и Into 133
4.8. Обеспечение совместимости интерфейса внешних функций с типами Rust………………… 133
Резюме………………………………………………………………………………………………………………………………………. 135
Глава 5. Работа с памятью……………………………………………………………………. 137
5.1. Управление памятью: куча и стек…………………………………………………………………………………… 137
5.2. Представление о владении: копирование, заимствование, ссылки и перемещения……. 140
5.3. Глубокое копирование……………………………………………………………………………………………………… 142
5.4. Предотвращение копирования………………………………………………………………………………………… 144
5.5. Умные указатели: тип Box……………………………………………………………………………………………….. 146
5.6. Подсчет ссылок…………………………………………………………………………………………………………………. 151
5.7. Клонирование при записи………………………………………………………………………………………………… 155
5.8. Пользовательские распределители…………………………………………………………………………………. 159
5.8.1. Создание пользовательского распределителя…………………………………………………….. 160
5.8.2. Создание пользовательского распределителя для защищенной памяти………….. 163
5.9. Кратко об умных указателях…………………………………………………………………………………………… 169
Резюме………………………………………………………………………………………………………………………………………. 170
Часть III. Корректность кода……………………………………………………. 173
Глава 6. Модульное тестирование………………………………………………………… 175
6.1. Чем примечательно тестирование в Rust?………………………………………………………………………. 175
6.2. Встроенные функции тестирования………………………………………………………………………………… 177
6.3. Среды тестирования…………………………………………………………………………………………………………. 179
6.4. Компилятор лучше вас знает, что не нужно тестировать…………………………………………….. 184
6.5. Работа с особыми случаями параллельного тестирования и глобального состояния. 185
6.6. Размышления о реструктуризации………………………………………………………………………………….. 191
6.7. Инструменты реструктуризации……………………………………………………………………………………… 191
6.7.1. Переформатирование…………………………………………………………………………………………….. 192
6.7.2. Переименование……………………………………………………………………………………………………… 192
6.7.3. Перемещение…………………………………………………………………………………………………………… 194
6.7.4. Переписывание……………………………………………………………………………………………………….. 194
6.8. Охват кода…………………………………………………………………………………………………………………………. 196
6.9. Работа с меняющейся экосистемой…………………………………………………………………………………. 198
Резюме………………………………………………………………………………………………………………………………………. 198
Глава 7. Интеграционное тестирование……………………………………………….. 199
7.1. Сравнение интеграционного и модульного тестирования……………………………………………. 200
7.2. Стратегии интеграционного тестирования…………………………………………………………………….. 203
7.3. Сравнение встроенного и внешнего интеграционного тестирования………………………….. 205
7.4. Библиотеки и инструменты для проведения интеграционного тестирования…………….. 206
7.4.1. Использование assert_cmd для тестирования CLI-приложений………………………… 206
7.4.2. Использование с интеграционными тестами крейта proptest…………………………….. 210
7.4.3. Другие инструменты интеграционного тестирования………………………………………… 211
7.5. Fuzz-тестирование…………………………………………………………………………………………………………….. 211
Резюме………………………………………………………………………………………………………………………………………. 216
Часть IV. Асинхронный Rust…………………………………………………….. 217
Глава 8. Асинхронное программирование в Rust………………………………….. 219
8.1. Среды выполнения……………………………………………………………………………………………………………. 221
8.2. Асинхронное мышление…………………………………………………………………………………………………… 222
8.3. Фьючерсы: обработка результатов выполнения асинхронных задач………………………… 224
8.3.1. Режим бездействия…………………………………………………………………………………………………. 224
8.3.2. Определение среды выполнения с помощью #[tokio::main]………………………………. 227
8.4. Ключевые слова async и .await: когда и где их использовать?…………………………………….. 227
8.5. Конкурентность и параллелизм с async………………………………………………………………………….. 230
8.6. Реализация асинхронного наблюдателя………………………………………………………………………… 234
8.7. Смешивание синхронного и асинхронного кода…………………………………………………………… 240
8.8. Когда не стоит применять асинхронность?……………………………………………………………………. 243
8.9. Трассировка и отладка асинхронного кода…………………………………………………………………… 243
8.10. Работа с асинхронностью при тестировании………………………………………………………………. 247
Резюме………………………………………………………………………………………………………………………………………. 248
Глава 9. Создание сервиса HTTP REST API…………………………………………. 251
9.1. Выбор веб-фреймворка…………………………………………………………………………………………………….. 252
9.2. Построение архитектуры…………………………………………………………………………………………………. 253
9.3. Проектирование API…………………………………………………………………………………………………………. 254
9.4. Библиотеки и инструменты……………………………………………………………………………………………… 255
9.5. Создание шаблонов приложений……………………………………………………………………………………. 257
9.5.1. Функция main()……………………………………………………………………………………………………….. 257
9.5.2. Инициализация трассировки: init_tracing()…………………………………………………………. 259
9.5.3. Инициализация пула базы данных: init_dbpool()……………………………………………….. 260
9.6. Моделирование данных…………………………………………………………………………………………………… 262
9.6.1. SQL-схема……………………………………………………………………………………………………………….. 262
9.6.2. Взаимодействие с нашими данными…………………………………………………………………….. 263
9.7. Объявление API-маршрутов…………………………………………………………………………………………….. 267
9.8. Реализация API-маршрутов……………………………………………………………………………………………… 269
9.9. Обработка ошибок……………………………………………………………………………………………………………. 272
9.10. Запуск сервиса………………………………………………………………………………………………………………… 273
Резюме………………………………………………………………………………………………………………………………………. 278
Глава 10. Создание CLI-инструмента HTTP REST API…………………………. 279
10.1. Выбор используемых инструментов и библиотек……………………………………………………….. 280
10.2. Проектирование CLI………………………………………………………………………………………………………. 281
10.3. Объявление команд…………………………………………………………………………………………………………. 282
10.4. Реализация команд…………………………………………………………………………………………………………. 285
10.5. Реализация запросов………………………………………………………………………………………………………. 287
10.6. Надлежащая обработка ошибок…………………………………………………………………………………… 289
10.7. Тестирование нашего CLI……………………………………………………………………………………………… 289
Резюме………………………………………………………………………………………………………………………………………. 293
Часть V. Оптимизация………………………………………………………………… 295
Глава 11. Оптимизация кода………………………………………………………………… 297
11.1. Абстракции с нулевой стоимостью……………………………………………………………………………….. 297
11.2. Векторы……………………………………………………………………………………………………………………………. 299
11.2.1. Выделение памяти для вектора…………………………………………………………………………. 299
11.2.2. Итераторы векторов…………………………………………………………………………………………… 301
11.2.3. Быстрое копирование с помощью Vec и слайсов…………………………………………….. 303
11.3. Применение возможностей SIMD………………………………………………………………………………….. 305
11.4. Распараллеливание с применением Rayon………………………………………………………………….. 307
11.5. Использование Rust для ускорения программ на других языках……………………………….. 309
11.6. Что делать дальше?………………………………………………………………………………………………………… 311
Резюме………………………………………………………………………………………………………………………………………. 312
Приложение…………………………………………………………………………………………. 313
Установка инструментов для примеров, приводимых в книге…………………………………………….. 313
Установка инструментов на macOS с помощью Homebrew………………………………………… 313
Установка инструментов на системах под управлением Linux…………………………………… 313
Установка rustup на Linux- или UNIX-системах…………………………………………………………… 313
Установка инструментов на системах под управлением Windows……………………………… 314
Управление rustc и другими Rust-компонентами с помощью rustup…………………………………… 314
Установка rustc и других компонентов………………………………………………………………………….. 314
Переключение исходных наборов инструментов с помощью rustup………………………….. 315
Обновление Rust-компонентов……………………………………………………………………………………….. 315
Установка HTTPie……………………………………………………………………………………………………………. 315
Предметный указатель…………………………………………………………………………. 317