Структурированная программа обучения Rust, сформулированная DeepSeek, которая фокусируется исключительно на языке и его концепциях, начиная с основ и заканчивая продвинутыми темами. Программа разделена на модули с ключевыми темами и практическими задачами.
Цель: Освоить синтаксис, идиомы и уникальные возможности Rust (владение, заимствование, времени жизни) для написания безопасного и эффективного системного кода.
Цель: Понять базовый синтаксис и структуры управления.
-
Темы:
- Hello World: Структура
main(), макросprintln!. - Переменные и константы: Ключевое слово
let, мутабельность (mut), константы (const). - Примитивные типы данных: Целочисленные, числа с плавающей точкой, логический тип, символы (
char). - Составные типы данных: Кортежи (
tuple), массивы (array), срезы (slice). - Управление потоком:
- Условия:
if,if let,else if,match. - Циклы:
loop,while,for(итерация по коллекциям и диапазонам).
- Условия:
- Функции: Объявление, параметры, возвращаемые значения (явный
returnили выражение без;). Модули и область видимости (pub).
- Hello World: Структура
-
Практические задачи:
- Конвертер температур (Цельсий ↔ Фаренгейт).
- Генератор n-го числа последовательности Фибоначчи.
- Вывод текста рождественской песни "The Twelve Days of Christmas" с использованием циклов и массивов данных.
Цель: Полностью понять систему владения, которая обеспечивает безопасность памяти без сборщика мусора.
-
Темы:
- Правила владения: Основные три правила.
- Перемещение (Move): Семантика перемещения для типов, не реализующих
Copy(например,String,Vec). - Клонирование (Clone): Явное создание глубоких копий.
- Типы-копии (Copy): Семантика копирования для простых типов, хранящихся в стеке (
i32,boolи т.д.). - Владение и функции: Передача владения в функцию и возврат из функции.
-
Практические задачи:
- Написать несколько небольших функций, которые передают
Stringиi32, чтобы пронаблюдать разницу в поведении (MovevsCopy). - Создать функцию, которая принимает вектор, выводит его элементы и возвращает владение обратно в
main.
- Написать несколько небольших функций, которые передают
Цель: Научиться работать с данными, не принимая владение, используя ссылки.
-
Темы:
- Неизменяемые ссылки (
&T): Чтение данных без их изменения. Правило: множество неизменяемых ссылок одновременно. - Изменяемые ссылки (
&mut T): Изменение заимствованных данных. Правило: только одна изменяемая ссылка в области видимости и никаких неизменяемых одновременно. - "Висячие" ссылки (Dangling References): Что это и как компилятор Rust их предотвращает.
- Срезы (
&[T],&str): Представление части коллекции или строки.
- Неизменяемые ссылки (
-
Практические задачи:
- Написать функцию, которая находит первое слово в строке и возвращает срез к нему.
- Реализовать функцию, которая принимает изменяемую ссылку на вектор целых чисел и увеличивает каждый элемент на 1.
Цель: Понять аннотации времени жизни для явного описания связей между временами жизни ссылок.
-
Темы:
- Концепция времени жизни: Область видимости, в которой ссылка действительна.
- Выведение времени жизни: Как компилятор в большинстве случаев выводит их сам.
- Аннотации времени жизни (
'a): Синтаксис и необходимость их использования в структурах и функциях, возвращающих ссылки. - Три правила элизии времени жизни.
- Статическое время жизни (
'static).
-
Практические задачи:
- Написать функцию
longest, которая принимает два строковых среза и возвращает срез наиболее длинной строки. Потребует явной аннотации времени жизни. - Создать структуру
Excerpt, которая хранит срез строки.
- Написать функцию
Цель: Моделировать данные с помощью структур и перечислений.
-
Темы:
- Структуры: Определение, создание экземпляров, поля, методы (блок
impl), ассоциированные функции (например, конструкторы). - Синтаксис обновления структур (
..). - Перечисления (Enums): Определение вариантов, данные внутри вариантов (как
Option<T>иResult<T, E>). - Конструкция
match: Исчерпывающее сопоставление, привязка значений. - Поток управления
if let: Для упрощенного сопоставления с одним образцом.
- Структуры: Определение, создание экземпляров, поля, методы (блок
-
Практические задачи:
- Определить структуру
Rectangleс методамиareaиcan_hold. - Реализовать простой калькулятор, использующий
enumдля операций иmatchдля вычислений. - Моделирование состояния веб-приложения (например,
enum State { Loading, Loaded(String), Error }).
- Определить структуру
Цель: Эффективно обрабатывать ошибки в Rust, используя Result и Option.
-
Темы:
panic!макрос: Неустранимые ошибки.- Тип
Result<T, E>: Устранимая ошибка. Обработка черезmatch,unwrap,expect,?оператор (распространение ошибок). - Тип
Option<T>: Представление наличия или отсутствия значения. Методыunwrap_or,map,and_then. - Создание пользовательских типов ошибок.
-
Практические задачи:
- Написать функцию для чтения числа из файла (симулировать) и возвращать
Result<i32, ParseIntError>. - Реализовать цепочку вызовов функций, возвращающих
Result, с использованием оператора?.
- Написать функцию для чтения числа из файла (симулировать) и возвращать
Цель: Писать повторно используемый полиморфный код.
-
Темы:
- Обобщенные функции и структуры: Синтаксис
<T>. - Типажи (Traits): Определение поведения (аналоги интерфейсов). Блок
impl Trait for Type. - Наследование типажей.
- Типажи как параметры:
fn func(item: &impl Trait)и формаfn func<T: Trait>(item: &T). whereоговорки для улучшения читаемости.- Возврат типов, реализующих типаж (
-> impl Trait).
- Обобщенные функции и структуры: Синтаксис
-
Практические задачи:
- Создать обобщенную функцию
largest, которая работает для любого типа, реализующего типажиPartialOrdиCopy. - Определить типаж
Summarizableдля структурNewsArticleиTweet.
- Создать обобщенную функцию
Цель: Работать с основными структурами данных.
-
Темы:
Vec<T>: Динамический массив, основные методы (push,pop,iter).Stringvs&str: Мutable vs immutable строки, основные операции.HashMap<K, V>: Ассоциативный массив, вставка, получение, обновление.- Итераторы и адаптеры итераторов:
iter(),into_iter(),iter_mut(),map,filter,collect().
-
Практические задачи:
- Подсчет частоты слов в тексте с использованием
HashMap. - Преобразование списка чисел в вектор, увеличение каждого числа и фильтрация четных с помощью цепочки итераторов.
- Подсчет частоты слов в тексте с использованием
Цель: Писать модульные и интеграционные тесты.
-
Темы:
- Модульные тесты: Атрибут
#[test], макросassert!,assert_eq!,assert_ne!. - Организация тестов: Модуль
testsс#[cfg(test)]. - Тестирование паник:
#[should_panic]. - Интеграционные тесты: Директория
tests/на верхнем уровне.
- Модульные тесты: Атрибут
-
Практические задачи:
- Написать модульные тесты для функции
add_twoи структурыRectangleиз предыдущих модулей. - Создать простой интеграционный тест.
- Написать модульные тесты для функции
Цель: Познакомиться с мощными возможностями Rust для углубленного изучения.
-
Темы:
- Умные указатели:
Box<T>(для рекурсивных структур),Rc<T>(подсчет ссылок),RefCell<T>(внутренняя изменяемость). - Многопоточность (
Concurrency):thread::spawn, каналы (mpsc), разделяемое состояние сMutex<T>иArc<T>. - Замыкания (Closures): Синтаксис, захват переменных из окружения, типажи
Fn,FnMut,FnOnce. - Макросы (
macro_rules!): Объявление макросов и их использование.
- Умные указатели:
-
Практические задачи (опционально, более сложные):
- Реализовать простой связанный список с помощью
Box. - Создать многопоточный сканер портов (учебный пример) или вычислитель с использованием пула потоков.
- Написать простой макрос для удобного логирования.
- Реализовать простой связанный список с помощью
Задача: Объединить полученные знания в одном проекте. Примеры идей:
- CLI утилита: Аналог
grep(поиск по файлам), простой калькулятор выражений. - Мини-веб-сервер: С использованием крейта
actix-webилиrocket(потребует изучения основ асинхронности и работы с крейтами). - Эмулятор CHIP-8: Отличный проект для понимания работы с памятью и битовыми операциями.
- Парсер Markdown или JSON: Работа с текстом и рекурсивными структурами данных.
- Официальная книга "The Rust Programming Language" ("Книга"):
doc.rust-lang.org/book/ - Rust by Example:
doc.rust-lang.org/rust-by-example/(интерактивные примеры) - Упражнения:
rustlings(маленькие интерактивные задания для отработки синтаксиса).
Примечание: Эта программа предполагает, что у вас уже настроена среда (компилятор rustc, менеджер пакетов cargo и, возможно, IDE/редактор). Весь код можно писать в файлах .rs и запускать через cargo new, cargo build, cargo run.