Шпаргалка по 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 / else | if x > 0 { ... } else { ... } |
| If как выражение | let y = if x > 0 { 1 } else { -1 }; |
| Бесконечный цикл | loop { ... } |
| Цикл, возвращающий значение | let v = loop { break 5; }; |
| Цикл while | while x < 100 { ... } |
| For по диапазону | for i in 0..10 { ... } |
| For по коллекции | for item in &items { ... } |
| Break / continue | break;, continue; |
Функции
Последнее выражение (без точки с запятой) - возвращаемое значение.
| Операция | Синтаксис |
|---|---|
| Базовая функция | fn add(a: i32, b: i32) -> i32 { a + b } |
| Явный return | fn 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 let | while 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 Trait | fn print(item: impl Display) { ... } |
| Трейт-объект | let shapes: Vec<Box<dyn Area>> = ...; |
Обработка ошибок (Result / Option)
Rust моделирует отсутствие значения через Option, а восстановимые ошибки - через Result.
| Операция | Синтаксис |
|---|---|
| Опциональное значение | Option<T>: Some(v) или None |
| Тип Result | Result<T, E>: Ok(v) или Err(e) |
| Вернуть Result | fn 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 в Result | opt.ok_or("missing")? |
Частые коллекции (Vec / HashMap)
Vec - растущий массив; HashMap - хранилище ключ-значение.
| Операция | Синтаксис |
|---|---|
| Создать вектор | let mut v: Vec<i32> = Vec::new(); |
| Литерал вектора | let v = vec![1, 2, 3]; |
| Push / pop | v.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 / get | m.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?
&x для неизменяемого заимствования или &mut x для изменяемого. Компилятор обеспечивает одно правило: одновременно можно иметь много неизменяемых заимствований или ровно одно изменяемое, что предотвращает гонки данных на этапе компиляции.В чём разница между Result и Option в Rust?
Option<T> представляет значение, которое может отсутствовать - это либо Some(v), либо None, и вы используете его, когда нет ошибки для сообщения, а есть лишь отсутствующее значение. Result<T, E> представляет операцию, которая может завершиться неудачей - это либо Ok(v), либо Err(e), несущий значение ошибки, когда что-то идёт не так. Используйте Option для "возможно, есть", а Result - для "это может завершиться неудачей"; оператор ? пробрасывает оба.