Rust – новый язык системного программирования, сочетающий высокую производительность и низкоуровневый контроль, характерные для С и C++, с безопасной работой с памятью и потоками. В начале книги рассмотрены типы данных и основные конструкции языка – выражения, модули, структуры, перечисления и образцы. Далее описываются характеристики и универсальные типы. В следующих главах приводятся сведения о замыканиях и итераторах. Наконец в последних главах книги вы найдете исчерпывающую информацию о коллекциях, обработке текста, вводе-выводе, конкурентности, макросах и небезопасном коде.
Издание предназначено для системных программистов, созревших для поиска альтернативы C++.
Author(s): Джим Блэнди, Джейсон Орендорф, А. А. Слинкин
Edition: 1
Publisher: ДМК Пресс
Year: 2018
Language: Russian
Commentary: Оглавление сделано иерархическим. В оригинальном файле pdf-оглавление было некачественным
Pages: 547
City: Москва
Tags: Rust
Содержание
Предисловие
Для кого написана эта книга
Зачем мы написали эту книгу
Обзор содержания книги
Графические выделения
Скачивание исходного кода примеров
Отзывы и пожелания
Список опечаток
Благодарности
Глава 1. Почему появился Rust?
Типобезопасность
Глава 2. Краткий обзор Rust
Скачивание и установка Rust
Простая функция
Написание и выполнение автономных тестов
Обработка аргументов командной строки
Простой веб-сервер
Конкурентность
Что такое множество Мандельброта
Разбор пары аргументов командной строки
Отображение пикселей на комплексные числа
Рисование множества
Запись файла изображения
Конкурентная программа рисования множества Мандельброта
Выполнение программы рисования множества Мандельброта
Невидимая безопасность
Глава 3. Базовые типы
Машинные типы
Целые типы
Типы с плавающей точкой
Тип bool
Символы
Кортежи
Указательные типы
Ссылки
Боксы
Простые указатели
Массивы, векторы и срезки
Массивы
Вектор
Поэлементное построение векторов
Срезки
Строковые типы
Строковые литералы
Байтовые строки
Строки в памяти
Тип String
Использование строк
Другие типы, похожие на строки
Более сложные типы
Глава 4. Владение
Владение
Передача владения
Другие операции с передачей
Передача владения и поток управления
Передача владения и индексированное содержимое
Копируемые типы: исключения из правила передачи владения
Rc и Arc: совместное владение
Глава 5. Ссылки
Ссылки как значения
Сравнение ссылок в Rust и в C++
Присваивание ссылкам
Ссылки на ссылки
Сравнение ссылок
Ссылки не бывают нулевыми
Заимствование ссылок на произвольные выражения
Ссылки на срезки и объекты характеристик
Безопасность ссылок
Заимствование локальной переменной
Получение ссылок в качестве параметров
Передача ссылок в качестве аргументов
Возврат ссылок
Структуры, содержащие ссылки
Различные параметрические времена жизни
Опускание параметрического времени жизни
Разделяемость и изменяемость
Оружие против моря объектов
Глава 6. Выражения
Язык выражений
Блоки и точки с запятой
Объявления
if и match
Циклы
Выражение return
Зачем в Rust цикл loop
Вызовы функций и методов
Поля и элементы
Операторы ссылки
Арифметические, поразрядные, логические операторы и операторы сравнения
Присваивание
Приведение типов
Замыкания
Приоритеты и ассоциативность
Что дальше
Глава 7. Обработка ошибок
Паника
Раскрутка стека
Снятие процесса
Тип Result
Обнаружение ошибок
Псевдонимы типа Result
Печать информации об ошибках
Распространение ошибок
Работа с ошибками нескольких типов
Ошибки, которых «не может быть»
Игнорирование ошибок
Обработка ошибок в main()
Объявление пользовательского типа ошибки
Почему именно тип Result?
Глава 8. Крейты и модули
Крейты
Сборочные профили
Модули
Модули в отдельных файлах
Пути и импорт
Стандартная прелюдия
Артикулы – строительные блоки в Rust
Превращение программы в библиотеку
Каталог src/bin
Атрибуты
Тесты и документация
Интеграционные тесты
Документация
Doc-тесты
Задание зависимостей
Версии
Cargo.lock
Публикация крейтов на сайте crates.io
Рабочие пространства
Прочие вкусности
Глава 9. Структуры
Структуры с именованными полями
Кортежеподобные структуры
Безэлементные структуры
Размещение структуры в памяти
Определение методов с помощью ключевого слова impl
Универсальные структуры
Структуры с параметрическим временем жизни
Выведение стандартных характеристик для структурных типов
Внутренняя изменяемость
Глава 10. Перечисления и образцы
Перечисления
Перечисления, содержащие данные
Перечисления в памяти
Обогащенные структуры данных на основе перечислений
Универсальные перечисления
Образцы
Литералы, переменные и метасимволы в образцах
Кортежные и структурные образцы
Ссылочные образцы
Сопоставление с несколькими возможностями
Охранные выражения
@-образцы
Где еще используются образцы
Построение двоичного дерева
Общая картина
Глава 11. Характеристики и универсальные типы
Использование характеристик
Объекты характеристик
Размещение объекта характеристики в памяти
Универсальные функции
Что использовать
Определение и реализация характеристик
Методы по умолчанию
Характеристики и сторонние типы
Употребление Self в характеристиках
Подхарактеристики
Статические методы
Полностью квалифицированные вызовы методов
Характеристики, определяющие связи между типами
Ассоциированные типы, или Как работают итераторы
Универсальные характеристики, или Как работает перегрузка операторов
Парные характеристики, или Как работает rand::random()
Обратное конструирование ограничений
Заключение
Глава 12. Перегрузка операторов
Арифметические и поразрядные операторы
Унарные операторы
Бинарные операторы
Составные операторы присваивания
Сравнение на равенство
Сравнение на больше-меньше
Index и IndexMut
Прочие операторы
Глава 13. Вспомогательные характеристики
Характеристика Drop
Характеристика Sized
Характеристика Clone
Характеристика Copy
Характеристики Deref и DerefMut
Характеристика Default
Характеристики AsRef и AsMut
Характеристики Borrow и BorrowMut
Характеристики From и Into
Характеристика ToOwned
Borrow и ToOwned за работой: скромное копирование при записи
Глава 14. Замыкания
Захват переменных
Замыкания с заимствованием
Замыкания с кражей
Типы функций и замыканий
Производительность замыканий
Замыкания и безопасность
Замыкания, которые убивают
FnOnce
FnMut
Обратные вызовы
Эффективное использование замыканий
Глава 15. Итераторы
Характеристики Iterator и IntoIterator
Создание итераторов
Методы iter и iter_mut
Реализации характеристики IntoIterator
Метод drain
Другие источники итераторов
Адаптеры итераторов
map и filter
filter_map и flat_map
scan
take и take_while
skip и skip_while
peekable
fuse
Обратимые итераторы и rev
inspect
chain
enumerate
zip
by_ref
cloned
cycle
Потребление итераторов
Простое аккумулирование: count, sum, product
max, min
max_by, min_by
max_by_key, min_by_key
Сравнение последовательностей
any и all
position, rposition и ExactSizeIterator
fold
nth
last
find
Построение коллекций: collect и FromIterator
Характеристика Extend
partition
Реализация собственных итераторов
Глава 16. Коллекции
Обзор
Тип Vec
Доступ к элементам
Итерирование
Увеличение и уменьшение вектора
Соединение
Расщепление
Перестановка элементов
Сортировка и поиск
Сравнение срезок
Случайные элементы
В Rust отсутствуют ошибки недействительности
Тип VecDeque
Тип LinkedList
Тип BinaryHeap
Типы HashMap и BTreeMap
Записи
Обход отображения
Типы HashSet и BTreeSet
Обход множества
Когда равные значения различны
Операции над множествами как единым целым
Хэширование
Применение пользовательского алгоритма хэширования
За пределами стандартных коллекций
Глава 17. Строки и текст
Общие сведения о Юникоде
ASCII, Latin-1 и Юникод
UTF-8
Направление текста
Символы (char)
Классификация символов
Работа с цифрами
Преобразование регистра символов
Преобразование в целое число и обратно
Типы String и str
Создание значений типа String
Простая инспекция
Дописывание и вставка текста
Удаление текста
Соглашения о поиске и итерировании
Образцы для поиска текста
Поиск и замена
Обход текста
Усечение
Преобразование регистра
Создание значений других типов из строк
Преобразование других типов в строки
Заимствование в виде других текстообразных типов
Доступ к байтам текста в кодировке UTF-8
Порождение текста из данных в кодировке UTF-8
Откладывание выделения памяти
Строки как универсальные коллекции
Форматирование значений
Форматирование текстовых значений
Форматирование чисел
Форматирование прочих типов
Форматирование значений для отладки
Форматирование указателей для отладки
Ссылка на аргументы по индексу или по имени
Динамическая ширина и точность
Форматирование пользовательских типов
Применение языка форматирования в своем коде
Регулярные выражения
Основы работы с Regex
Ленивое построение значений типа Regex
Нормализация
Формы нормализации
Крейт unicode-normalization
Глава 18. Ввод и вывод
Читатели и писатели
Читатели
Буферизованные читатели
Чтение строк
Собирание строк
Писатели
Файлы
Поиск
Другие типы читателей и писателей
Двоичные данные, сжатие и сериализация
Файлы и каталоги
Типы OsStr и Path
Методы типов Path и PathBuf
Функции доступа к файловой системе
Чтение каталогов
Платформенно-зависимые средства
Срества сетевого программирования
Глава 19. Конкурентность
Вилочный параллелизм
Функции spawn и join
Обработка ошибок в потоках
Разделение неизменяемых данных между потоками
Rayon
И снова о множестве Мандельброта
Каналы
Отправка значений
Получение значений
Выполнение конвейера
Возможности и производительность каналов
Потокобезопасность: Send и Sync
Отправка объектов почти любого итератора по каналу
За пределами конвейеров
Разделяемое изменяемое состояние
Что такое мьютекс?
Мьютексы в Rust
mut и Mutex
Почему мьютексы не всегда хорошая идея
Взаимоблокировка
Отравленные мьютексы
Каналы с несколькими производителями и мьютексом
Блокировки чтения-записи (RwLock)
Условные переменные (Condvar)
Атомарные типы
Глобальные переменные
Как выглядит написание конкурентного кода на Rust
Глава 20. Макросы
Основы макросов
Основы макрорасширения
Непредвиденные последствия
Повторение
Встроенные макросы
Отладка макросов
Макрос json!
Типы фрагментов
Рекурсия в макросах
Использование характеристик совместно с макросами
Области видимости и гигиена
Импорт и экспорт макросов
Предотвращение синтаксических ошибок при сопоставлении
За пределами macro_rules!
Глава 21. Небезопасный код
Небезопасность от чего?
Unsafe-блоки
Пример: эффективный тип ASCII-строки
Unsafe-функции
Unsafe-блок или unsafe-функция?
Неопределенное поведение
Небезопасные характеристики
Простые указатели
Безопасное разыменование простых указателей
Пример: RefWithFlag
Нулевые указатели
Размеры и выравнивание типов
Арифметика указателей
Передача в память и из памяти
Пример: GapBuffer
Безопасность паники в небезопасном коде
Иноязычные функции: вызов функций на C и C++ из Rust
Поиск общего представления данных
Объявление иноязычных функций и переменных
Использование библиотечных функций
Низкоуровневый интерфейс с libgit2
Безопасный интерфейс к libgit2
Заключение
Предметный указатель
Об авторах
Колофон