Ласкаво просимо в 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
Chromium
38.
Ласкаво просимо
39.
Установка
40.
Порівняння екосистем Chromium і Cargo
41.
Політика
42.
Правила побудови
❱
42.1.
Небезпечний код
42.2.
Залежнісь Chromium C++ від коду Rust
42.3.
Visual Studio Code
42.4.
Вправа
43.
Тестування
❱
43.1.
Бібліотека rust_gtest_interop
43.2.
Правила GN для тестів Rust
43.3.
Макрос chromium::import!
43.4.
Вправа
44.
Взаємодія з C++
❱
44.1.
Приклади прив'язок
44.2.
Обмеження CXX
44.3.
Обробка помилок в CXX
❱
44.3.1.
Обробка помилок: приклад QR
44.3.2.
Обробка помилок: приклад PNG
44.4.
Використання CXX у Chromium
44.5.
Вправа
45.
Додавання крейтів третіх сторін
❱
45.1.
Налаштування Cargo.toml
45.2.
Налаштування gnrt_config.toml
45.3.
Завантаження крейтів
45.4.
Створення правил побудови gn
45.5.
Вирішення проблем
❱
45.5.1.
Скрипти збірки, які генерують код
45.5.2.
Скрипти збірки, які будують C++ або виконують довільні дії
45.6.
Залежнісь від крейта
45.7.
Перевірки та аудити
45.8.
Реєстрація в Chromium Source Code
45.9.
Підтримання крейтів в актуальному стані
45.10.
Вправа
46.
Зібрання усього разом - вправа
47.
Рішення вправ
Залізо: Ранок
48.
Ласкаво просимо
49.
no_std
❱
49.1.
Мінімальний приклад
49.2.
alloc
50.
Мікроконтролери
❱
50.1.
Сирий ввід вивід з відображеної пам'яті (MMIO)
50.2.
Крейти доступу до периферійних пристроїв (PACs)
50.3.
Крейти абстракції обладнання (HAL)
50.4.
Крейти підтримки плат
50.5.
Шаблон стану типу
50.6.
embedded-hal
50.7.
probe-rs та cargo-embed
❱
50.7.1.
Налагодження
50.8.
Інші проєкти
51.
Вправи
❱
51.1.
Компас
51.2.
Рішення
Залізо: Полудень
52.
Прикладні процесори
❱
52.1.
Підготовка до Rust
52.2.
Вбудована збірка
52.3.
Ввід вивід з відображеної пам'яті (MMIO)
52.4.
Давайте напишемо драйвер UART
❱
52.4.1.
Більше трейтів
52.5.
Кращий драйвер UART
❱
52.5.1.
Бітові прапорці (крейт bitflags)
52.5.2.
Кілька регістрів
52.5.3.
Драйвер
52.5.4.
Використання
52.6.
Журналювання
❱
52.6.1.
Використання
52.7.
Виключення
52.8.
Інші проєкти
53.
Корисні крейти
❱
53.1.
zerocopy
53.2.
aarch64-paging
53.3.
buddy_system_allocator
53.4.
tinyvec
53.5.
spin
54.
Залізо на Android
❱
54.1.
vmbase
55.
Вправи
❱
55.1.
Драйвер годинника реального часу (RTC)
55.2.
Рішення
Одночасність виконання: Ранок
56.
Ласкаво просимо
57.
Потоки
❱
57.1.
Звичайні потоки
57.2.
Потоки з областю видимості
58.
Канали
❱
58.1.
Відправники та отримувачі
58.2.
Незав'язані канали
58.3.
Зав'язані канали
59.
Send та Sync
❱
59.1.
Маркерні трейти
59.2.
Send
59.3.
Sync
59.4.
Приклади
60.
Спільний стан
❱
60.1.
Arc
60.2.
Mutex
60.3.
Приклад
61.
Вправи
❱
61.1.
Вечеря філософів
61.2.
Перевірка багатопоточних посилань
61.3.
Рішення
Одночасність виконання: Полудень
62.
Ласкаво просимо
63.
Основи асинхронізації
❱
63.1.
async/await
63.2.
Futures
63.3.
Середовища виконання
❱
63.3.1.
Токіо
63.4.
Завдання
64.
Канали та потік управління
❱
64.1.
Асинхронні канали
64.2.
Join
64.3.
Select
65.
Підводні камені
❱
65.1.
Блокування Виконавця
65.2.
Pin
65.3.
Асинхронні трейти
65.4.
Скасування
66.
Вправи
❱
66.1.
Вечеря філософів
66.2.
Програма широкомовного чату
66.3.
Рішення
Заключні слова
67.
Дякую!
68.
Глосарій
69.
Інші ресурси
70.
Кредити
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 (українська)
Рішення вправ
Рішення вправ з Chromium можна знайти в
цій серії CLs
.