Ласкаво просимо в Comprehensive Rust 🦀
1.
Проведення курсу
❱
1.1.
Структура курсу
1.2.
Гарячі клавіші
1.3.
Переклади
2.
Використання Cargo
❱
2.1.
Екосистема Rust
2.2.
Приклади коду
2.3.
Локальний запуск Cargo
День 1: Ранок
3.
Ласкаво просимо
4.
Hello World!
❱
4.1.
Що таке Rust?
4.2.
Переваги Rust
4.3.
Ігровий майданчик
5.
Типи та значення
❱
5.1.
Hello World!
5.2.
Змінні
5.3.
Значення
5.4.
Арифметика
5.5.
Виведення типів
5.6.
Вправа: Фібоначчі
❱
5.6.1.
Рішення
6.
Основи потоку керування
❱
6.1.
Вирази if
6.2.
Цикли
❱
6.2.1.
for
6.2.2.
loop
6.3.
break та continue
❱
6.3.1.
Мітки
6.4.
Блоки та області застосування
❱
6.4.1.
Області видимості та затінення
6.5.
Функції
6.6.
Макроси
6.7.
Вправа: Послідовність Коллатца
❱
6.7.1.
Рішення
День 1: Полудень
7.
Ласкаво просимо
8.
Кортежі та масиви
❱
8.1.
Масиви
8.2.
Кортежі
8.3.
Ітерація масиву
8.4.
Патерни та деструктуризація
8.5.
Вправа: Вкладені масиви
❱
8.5.1.
Рішення
9.
Посилання
❱
9.1.
Спільні посилання
9.2.
Ексклюзивні посилання
9.3.
Зрізи
9.4.
Рядки
9.5.
Вправа: Геометрія
❱
9.5.1.
Рішення
10.
Типи, які визначаються користувачем
❱
10.1.
Іменовані структури
10.2.
Кортежні структури
10.3.
Перелічувані типи
10.4.
Константи
10.5.
Статика
10.6.
Псевдоніми типу
10.7.
Вправа: події в ліфті
❱
10.7.1.
Рішення
День 2: Ранок
11.
Ласкаво просимо
12.
Зіставлення зразків
❱
12.1.
Співставлення значень
12.2.
Деструктурування структур
12.3.
Деструктурування переліків
12.4.
Потік контролю Let
12.5.
Вправа: обчислення виразу
❱
12.5.1.
Рішення
13.
Методи та Трейти
❱
13.1.
Методи
13.2.
Трейти
❱
13.2.1.
Реалізація трейтів
13.2.2.
Супертрейти
13.2.3.
Асоційовані типи
13.3.
Виведення
13.4.
Вправа: Загальний логгер
❱
13.4.1.
Рішення
День 2: Полудень
14.
Ласкаво просимо
15.
Узагальнені типи
❱
15.1.
Узагальнені функції
15.2.
Узагальнені типи даних
15.3.
Узагальнені трейти
15.4.
Обмеження трейту
15.5.
impl Trait
15.6.
dyn Trait
15.7.
Вправа: узагальнена min
❱
15.7.1.
Рішення
16.
Типи стандартної бібліотеки
❱
16.1.
Стандартна бібліотека
16.2.
Документація
16.3.
Option
16.4.
Result
16.5.
String
16.6.
Vec
16.7.
HashMap
16.8.
Вправа: Лічильник
❱
16.8.1.
Рішення
17.
Трейти стандартної бібліотеки
❱
17.1.
Порівняння
17.2.
Оператори
17.3.
From та Into
17.4.
Приведення
17.5.
Read та Write
17.6.
Default, синтаксис оновлення структури
17.7.
Закриття
17.8.
Вправа: ROT13
❱
17.8.1.
Рішення
День 3: Ранок
18.
Ласкаво просимо
19.
Управління пам'яттю
❱
19.1.
Огляд пам'яті програми
19.2.
Підходи до управління пам'яттю
19.3.
Володіння
19.4.
Семантика переміщення
19.5.
Clone
19.6.
Типи які копіюються
19.7.
Drop
19.8.
Вправа: Тип будівельника
❱
19.8.1.
Рішення
20.
Розумні вказівники
❱
20.1.
Box<T>
20.2.
Rc
20.3.
Принадлежні об'єкти трейтів
20.4.
Вправа: Бінарне дерево
❱
20.4.1.
Рішення
День 3: Полудень
21.
Ласкаво просимо
22.
Запозичення
❱
22.1.
Запозичення значення
22.2.
Перевірка запозичення
22.3.
Помилки запозичення
22.4.
Внутрішня мутабельність
22.5.
Вправа: Статистика здоров’я
❱
22.5.1.
Рішення
23.
Тривалість життя
❱
23.1.
Анотації тривалісті життя
23.2.
Упущення тривалісті життя
23.3.
Тривалість життя структур
23.4.
Вправа: Розбір Protobuf
❱
23.4.1.
Рішення
День 4: Ранок
24.
Ласкаво просимо
25.
Ітератори
❱
25.1.
Ітератор
25.2.
IntoIterator
25.3.
FromIterator
25.4.
Вправа: ланцюжок методів ітератора
❱
25.4.1.
Рішення
26.
Модулі
❱
26.1.
Модулі
26.2.
Ієрархія файлової системи
26.3.
Видимість
26.4.
use, super, self
26.5.
Вправа: Модулі для бібліотеки графічного інтерфейсу користувача
❱
26.5.1.
Рішення
27.
Тестування
❱
27.1.
Тестові модулі
27.2.
Інші типи тестів
27.3.
Лінти компілятора та Clippy
27.4.
Вправа: Алгоритм Луна
❱
27.4.1.
Рішення
День 4: Полудень
28.
Ласкаво просимо
29.
Обробка помилок
❱
29.1.
Паніки
29.2.
Result
29.3.
Оператор спроб
29.4.
Перетворення спроб
29.5.
Error трейт
29.6.
thiserror
29.7.
anyhow
29.8.
Вправа: Переписування с Result
❱
29.8.1.
Рішення
30.
Небезпечний Rust
❱
30.1.
Unsafe
30.2.
Розіменування "сирих" вказівників
30.3.
Несталі статичні змінні
30.4.
Об'єднання
30.5.
Небезпечні функції
30.6.
Небезпечні трейти
30.7.
Вправа: обгортка FFI
❱
30.7.1.
Рішення
Android
31.
Ласкаво просимо
32.
Установка
33.
Правила побудови
❱
33.1.
Бінарний файл
33.2.
Бібліотека
34.
AIDL
❱
34.1.
Посібник із сервісу Birthday
❱
34.1.1.
Інтерфейс
34.1.2.
API сервісу
34.1.3.
Сервіс
34.1.4.
Сервер
34.1.5.
Розгортка
34.1.6.
Кліент
34.1.7.
Зміна API
34.1.8.
Оновлення реалізацій
34.2.
AIDL типи
❱
34.2.1.
Примітивні типи
34.2.2.
Типи Масивів
34.2.3.
Надсилання об'єктів
34.2.4.
Посилкові данні
34.2.5.
Надсилання файлів
35.
Тестування
❱
35.1.
GoogleTest
35.2.
Mocking
36.
Журналювання
37.
Інтероперабельність
❱
37.1.
З С
❱
37.1.1.
Виклик С за допомогою Bindgen
37.1.2.
Виклик Rust з C
37.2.
З С++
❱
37.2.1.
Модуль Bridge
37.2.2.
Rust Bridge
37.2.3.
Згенерований C++
37.2.4.
C++ Bridge
37.2.5.
Спільні типи
37.2.6.
Спільні переліки
37.2.7.
Обробка помилок в Rust
37.2.8.
Обробка помилок в C++
37.2.9.
Додаткові типи
37.2.10.
Збірка для Android: C++
37.2.11.
Збірка для Android: Genrules
37.2.12.
Збірка для Android: Rust
37.3.
З Java
38.
Вправи
Chromium
39.
Ласкаво просимо
40.
Установка
41.
Порівняння екосистем Chromium і Cargo
42.
Політика
43.
Правила побудови
❱
43.1.
Небезпечний код
43.2.
Залежнісь Chromium C++ від коду Rust
43.3.
Visual Studio Code
43.4.
Вправа
44.
Тестування
❱
44.1.
Бібліотека rust_gtest_interop
44.2.
Правила GN для тестів Rust
44.3.
Макрос chromium::import!
44.4.
Вправа
45.
Взаємодія з C++
❱
45.1.
Приклади прив'язок
45.2.
Обмеження CXX
45.3.
Обробка помилок в CXX
❱
45.3.1.
Обробка помилок: приклад QR
45.3.2.
Обробка помилок: приклад PNG
45.4.
Використання CXX у Chromium
45.5.
Вправа
46.
Додавання крейтів третіх сторін
❱
46.1.
Налаштування Cargo.toml
46.2.
Налаштування gnrt_config.toml
46.3.
Завантаження крейтів
46.4.
Створення правил побудови gn
46.5.
Вирішення проблем
❱
46.5.1.
Скрипти збірки, які генерують код
46.5.2.
Скрипти збірки, які будують C++ або виконують довільні дії
46.6.
Залежнісь від крейта
46.7.
Перевірки та аудити
46.8.
Реєстрація в Chromium Source Code
46.9.
Підтримання крейтів в актуальному стані
46.10.
Вправа
47.
Зібрання усього разом - вправа
48.
Рішення вправ
Залізо: Ранок
49.
Ласкаво просимо
50.
no_std
❱
50.1.
Мінімальний приклад
50.2.
alloc
51.
Мікроконтролери
❱
51.1.
Сирий ввід вивід з відображеної пам'яті (MMIO)
51.2.
Крейти доступу до периферійних пристроїв (PACs)
51.3.
Крейти абстракції обладнання (HAL)
51.4.
Крейти підтримки плат
51.5.
Шаблон стану типу
51.6.
embedded-hal
51.7.
probe-rs та cargo-embed
❱
51.7.1.
Налагодження
51.8.
Інші проєкти
52.
Вправи
❱
52.1.
Компас
52.2.
Рішення
Залізо: Полудень
53.
Прикладні процесори
❱
53.1.
Підготовка до Rust
53.2.
Вбудована збірка
53.3.
Ввід вивід з відображеної пам'яті (MMIO)
53.4.
Давайте напишемо драйвер UART
❱
53.4.1.
Більше трейтів
53.5.
Кращий драйвер UART
❱
53.5.1.
Бітові прапорці (крейт bitflags)
53.5.2.
Кілька регістрів
53.5.3.
Драйвер
53.5.4.
Використання
53.6.
Журналювання
❱
53.6.1.
Використання
53.7.
Виключення
53.8.
Інші проєкти
54.
Корисні крейти
❱
54.1.
zerocopy
54.2.
aarch64-paging
54.3.
buddy_system_allocator
54.4.
tinyvec
54.5.
spin
55.
Android
❱
55.1.
vmbase
56.
Вправи
❱
56.1.
Драйвер годинника реального часу (RTC)
56.2.
Рішення
Одночасність виконання: Ранок
57.
Ласкаво просимо
58.
Потоки
❱
58.1.
Звичайні потоки
58.2.
Потоки з областю видимості
59.
Канали
❱
59.1.
Відправники та отримувачі
59.2.
Незав'язані канали
59.3.
Зав'язані канали
60.
Send та Sync
❱
60.1.
Маркерні трейти
60.2.
Send
60.3.
Sync
60.4.
Приклади
61.
Спільний стан
❱
61.1.
Arc
61.2.
Mutex
61.3.
Приклад
62.
Вправи
❱
62.1.
Вечеря філософів
62.2.
Перевірка багатопоточних посилань
62.3.
Рішення
Одночасність виконання: Полудень
63.
Ласкаво просимо
64.
Основи асинхронізації
❱
64.1.
async/await
64.2.
Futures
64.3.
Середовища виконання
❱
64.3.1.
Токіо
64.4.
Завдання
65.
Канали та потік управління
❱
65.1.
Асинхронні канали
65.2.
Join
65.3.
Select
66.
Підводні камені
❱
66.1.
Блокування Виконавця
66.2.
Pin
66.3.
Асинхронні трейти
66.4.
Скасування
67.
Вправи
❱
67.1.
Вечеря філософів
67.2.
Програма широкомовного чату
67.3.
Рішення
Заключні слова
68.
Дякую!
69.
Глосарій
70.
Інші ресурси
71.
Кредити
Light
Rust
Coal
Navy
Ayu
Comprehensive Rust 🦀
English
Brazilian Portuguese (Português do Brasil)
Chinese Simplified (汉语)
Chinese Traditional (漢語)
Japanese (日本語)
Korean (한국어)
Farsi (فارسی)
Spanish (Español)
Ukrainian (українська)
З С++
Крейт CXX
дає змогу безпечно взаємодіяти між Rust і C++.
Загальний підхід виглядає так: