Menu
Coddy logo textTech

Шпаргалка по Rust

Последнее обновление

Hello World и структура

Программа на Rust начинается с fn main; операторы заканчиваются точкой с запятой.

ОперацияСинтаксис
Точка входаfn main() { ... }
Вывести строкуprintln!("Hello, World!");
Вывод со значениямиprintln!("{} is {}", name, age);
Вывод в отладочной формеprintln!("{:?}", value);
Строчный комментарий// comment
Использовать элемент из модуляuse std::collections::HashMap;
Собрать и запуститьcargo run
Собрать release-бинарникcargo build --release

Переменные и типы (let / mut)

Привязки по умолчанию неизменяемы; добавьте mut, чтобы разрешить переназначение.

ОперацияСинтаксис
Неизменяемая привязкаlet x = 5;
Изменяемая привязкаlet mut count = 0;
Явный типlet age: u32 = 30;
Константаconst MAX: u32 = 100;
Затенение (shadowing)let x = x + 1;
Целочисленные типыi32, u32, i64, usize
Другие скалярыf64, bool, char
Кортежlet pair: (i32, &str) = (1, "a");
Преобразование типаlet f = x as f64;

Управление потоком

if - это выражение, и в Rust есть три формы циклов.

ОперацияСинтаксис
If / elseif x > 0 { ... } else { ... }
If как выражениеlet y = if x > 0 { 1 } else { -1 };
Бесконечный циклloop { ... }
Цикл, возвращающий значениеlet v = loop { break 5; };
Цикл whilewhile x < 100 { ... }
For по диапазонуfor i in 0..10 { ... }
For по коллекцииfor item in &items { ... }
Break / continuebreak;, continue;

Функции

Последнее выражение (без точки с запятой) - возвращаемое значение.

ОперацияСинтаксис
Базовая функцияfn add(a: i32, b: i32) -> i32 { a + b }
Явный returnfn f() -> i32 { return 5; }
Без возвращаемого значенияfn log(msg: &str) { ... }
Принять ссылкуfn len(s: &String) -> usize { s.len() }
Замыканиеlet add = |a, b| a + b;
Замыкание с типомlet sq = |x: i32| -> i32 { x * x };
Функция как аргументfn apply(f: impl Fn(i32) -> i32) { ... }

Владение и заимствование

У каждого значения один владелец; ссылки заимствуют его, не получая владения.

ОперацияСинтаксис
Перемещение (владение передаётся)let b = a; (a больше не валиден)
Clone (глубокая копия)let b = a.clone();
Неизменяемое заимствованиеlet r = &x;
Изменяемое заимствованиеlet r = &mut x;
Заимствование в функцииfn read(s: &String) { ... }
Разыменование*r
Правило заимствованияМного & ЛИБО один &mut одновременно, но не оба
Срез (заимствует диапазон)let part = &arr[1..3];

Структуры и перечисления

Структуры группируют связанные данные; перечисления моделируют значение, которое является одним из нескольких вариантов.

ОперацияСинтаксис
Определить структуруstruct Point { x: i32, y: i32 }
Создать экземплярlet p = Point { x: 1, y: 2 };
Доступ к полюp.x
Кортежная структураstruct Pair(i32, i32);
Метод (блок impl)impl Point { fn dist(&self) -> f64 { ... } }
Ассоциированная функцияimpl Point { fn new() -> Self { ... } }
Определить перечислениеenum Shape { Circle(f64), Rect(f64, f64) }
Перечисление с именованными полямиenum Msg { Move { x: i32, y: i32 } }
Вывести трейты (derive)#[derive(Debug, Clone)]

Сопоставление с образцом (match)

match сравнивает значение с образцами и должен быть исчерпывающим.

ОперацияСинтаксис
Сопоставление по значениямmatch x { 1 => "one", _ => "other" }
Сопоставление перечисленияmatch shape { Shape::Circle(r) => ... }
Сопоставление диапазонаmatch n { 1..=5 => ..., _ => ... }
Привязка с охранным условиемmatch x { n if n > 0 => ... }
Сопоставление кортежаmatch point { (0, y) => ..., (x, _) => ... }
if let (один образец)if let Some(v) = opt { ... }
while letwhile let Some(v) = stack.pop() { ... }
Деструктуризация структурыlet Point { x, y } = p;

Трейты и дженерики

Трейты определяют общее поведение; дженерики позволяют коду работать с множеством типов.

ОперацияСинтаксис
Определить трейтtrait Area { fn area(&self) -> f64; }
Реализовать трейтimpl Area for Circle { fn area(&self) -> f64 { ... } }
Метод по умолчаниюtrait Greet { fn hi(&self) { ... } }
Обобщённая функцияfn largest<T: PartialOrd>(list: &[T]) -> &T { ... }
Обобщённая структураstruct Wrapper<T> { value: T }
Ограничение трейта (where)fn f<T>(x: T) where T: Display { ... }
Аргумент impl Traitfn print(item: impl Display) { ... }
Трейт-объектlet shapes: Vec<Box<dyn Area>> = ...;

Обработка ошибок (Result / Option)

Rust моделирует отсутствие значения через Option, а восстановимые ошибки - через Result.

ОперацияСинтаксис
Опциональное значениеOption<T>: Some(v) или None
Тип ResultResult<T, E>: Ok(v) или Err(e)
Вернуть Resultfn read() -> Result<String, Error> { ... }
Проброс через ?let data = read()?;
Unwrap (паникует при None/Err)opt.unwrap()
Значение по умолчаниюopt.unwrap_or(0)
Преобразовать значениеopt.map(|v| v + 1)
Обработать обе ветвиmatch res { Ok(v) => ..., Err(e) => ... }
Преобразовать Option в Resultopt.ok_or("missing")?

Частые коллекции (Vec / HashMap)

Vec - растущий массив; HashMap - хранилище ключ-значение.

ОперацияСинтаксис
Создать векторlet mut v: Vec<i32> = Vec::new();
Литерал вектораlet v = vec![1, 2, 3];
Push / popv.push(4);, v.pop();
Доступ по индексуv[0]
Безопасный доступv.get(0) возвращает Option<&T>
Переборfor x in &v { ... }
Длинаv.len()
Создать мапуlet mut m: HashMap<String, i32> = HashMap::new();
Insert / getm.insert(k, v);, m.get(&k)
Entry API*m.entry(k).or_insert(0) += 1;

Синтаксис Rust, который нужен чаще всего, на одной странице. Эта шпаргалка по Rust - быстрый справочник по ядру языка: переменные и изменяемость, владение и заимствование, структуры и перечисления, сопоставление с образцом, трейты и дженерики, а также типы Result и Option, лежащие в основе обработки ошибок в Rust.

Всё здесь - стандартный Rust, который компилируется на свежем стабильном инструментарии. Копируйте нужное или попробуйте каждый фрагмент вживую в playground для Rust - без установки cargo.

Часто задаваемые вопросы по шпаргалке Rust

Эта шпаргалка по Rust бесплатна?
Да. Эта шпаргалка по Rust полностью бесплатна, регистрация не требуется. Добавьте её в закладки и возвращайтесь, когда нужно посмотреть образец match, ограничение трейта или метод коллекции.
Что такое владение и заимствование в Rust?
Владение - это модель памяти Rust: у каждого значения ровно один владелец, и значение освобождается, когда этот владелец выходит из области видимости. Заимствование позволяет обращаться к значению, не получая владения, через ссылку - &x для неизменяемого заимствования или &mut x для изменяемого. Компилятор обеспечивает одно правило: одновременно можно иметь много неизменяемых заимствований или ровно одно изменяемое, что предотвращает гонки данных на этапе компиляции.
В чём разница между Result и Option в Rust?
Option<T> представляет значение, которое может отсутствовать - это либо Some(v), либо None, и вы используете его, когда нет ошибки для сообщения, а есть лишь отсутствующее значение. Result<T, E> представляет операцию, которая может завершиться неудачей - это либо Ok(v), либо Err(e), несущий значение ошибки, когда что-то идёт не так. Используйте Option для "возможно, есть", а Result - для "это может завершиться неудачей"; оператор ? пробрасывает оба.
Можно ли практиковать Rust онлайн?
Да. Откройте playground для Rust, чтобы скомпилировать и запустить любой фрагмент из этой шпаргалки прямо в браузере - без установки cargo или инструментария. А если нужна структура, бесплатный интерактивный курс Rust от Coddy шаг за шагом проведёт вас от переменных и владения до трейтов и обработки ошибок.
Подходит ли эта шпаргалка для начинающих?
Да. Она построена от самых распространённых тем (переменные, управление потоком, функции) к продвинутым (трейты, дженерики, обработка ошибок), так что верхние разделы можно использовать с первого дня и постепенно осваивать владение и остальное.
Coddy programming languages illustration

Изучайте Rust с Coddy

НАЧАТЬ