Rust в 2025: Полное руководство для начинающих с нуля

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: Почему Rust — это выбор 2025 года

В 2025 году Rust продолжает уверенно завоёвывать сердца разработчиков по всему миру. Согласно ежегодному опросу Stack Overflow, Rust уже восьмой год подряд признаётся самым любимым языком программирования. Его главные козыри — безопасность памяти без сборщика мусора и высочайшая производительность, сравнимая с C и C++. Если вы знакомы с Python, но хотите научиться писать быстрые и надёжные системные приложения, веб-ассемблер или даже операционные системы — Rust станет вашим идеальным следующим шагом.

В этой статье мы разберём, с чего начать изучение Rust в 2025 году: как установить инструментарий, написать первую программу и понять ключевые концепции. Поехали!

1. Установка Rust и знакомство с Cargo

Первое, что вам нужно сделать — установить компилятор rustc и менеджер пакетов Cargo. В 2025 году процесс максимально упрощён.

Установка через rustup

Официальный и рекомендуемый способ — использовать утилиту rustup. Откройте терминал и выполните команду:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Скрипт предложит стандартные настройки — просто нажмите Enter. После установки перезагрузите терминал или выполните:

source $HOME/.cargo/env

Проверьте, что всё работает:

rustc --version
cargo --version

Первая программа: "Hello, world!"

Создадим новый проект с помощью Cargo:

cargo new hello_rust
cd hello_rust

Cargo создаст структуру каталогов. Откройте файл src/main.rs — в нём уже есть заготовка:

fn main() {
    println!("Hello, world!");
}

Соберите и запустите программу одной командой:

cargo run

Вы увидите заветное приветствие. Поздравляю, вы написали свою первую программу на Rust!

2. Основы синтаксиса Rust: переменные, типы и функции

Rust — язык со строгой статической типизацией, но компилятор часто сам выводит типы. Давайте разберём базовые конструкции.

Переменные и неизменяемость

По умолчанию все переменные в Rust неизменяемы (immutable). Это одна из ключевых фич языка, обеспечивающая безопасность.

fn main() {
    let x = 5;          // неизменяемая переменная
    // x = 6;           // Ошибка! Нельзя изменить
    let mut y = 10;     // изменяемая переменная (mut)
    y += 5;             // Теперь y = 15
    println!("x = {}, y = {}", x, y);
}

Типы данных

Rust поддерживает привычные типы: целые числа (i32, u64), числа с плавающей точкой (f64), логический (bool), символ (char) и строки (String, &str).

fn main() {
    let a: i32 = -42;          // целое со знаком
    let b: u8 = 255;           // беззнаковое 8-битное
    let c: f64 = 3.1415;       // double
    let is_rust_cool = true;   // bool
    let letter = 'R';          // char (4 байта, Unicode)
    let greeting = String::from("Привет, Rust!");
    println!("{} {} {} {} {} {}", a, b, c, is_rust_cool, letter, greeting);
}

Функции

Функции объявляются с помощью ключевого слова fn. Тип возвращаемого значения указывается после стрелки ->.

fn add(x: i32, y: i32) -> i32 {
    x + y   // последнее выражение — это return (без точки с запятой)
}

fn main() {
    let sum = add(10, 20);
    println!("10 + 20 = {}", sum);
}

3. Ключевая концепция: владение и заимствование

Самая сложная, но и самая важная тема в Rust — система владения (ownership). Именно она позволяет гарантировать безопасность памяти без сборщика мусора.

Правила владения

  • У каждого значения в Rust есть владелец (переменная).
  • В каждый момент времени может быть только один владелец.
  • Когда владелец выходит из области видимости, значение удаляется.

Рассмотрим пример:

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;          // Владение перемещено в s2
    // println!("{}", s1); // Ошибка! s1 больше не владеет данными
    println!("{}", s2);   // Работает
}

Заимствование (Borrowing)

Чтобы передать данные в функцию, не передавая владение, используются ссылки (&).

fn calculate_length(s: &String) -> usize {
    s.len()               // s — ссылка на String
}                         // s выходит из области видимости, но ничего не удаляется

fn main() {
    let my_string = String::from("Rust");
    let len = calculate_length(&my_string);
    println!("Длина '{}' = {}", my_string, len); // my_string всё ещё доступна
}

Изменяемые ссылки

Если нужно изменить данные через ссылку, используйте &mut. Важно: в одной области видимости может быть только одна изменяемая ссылка на данные.

fn change(s: &mut String) {
    s.push_str(" is amazing!");
}

fn main() {
    let mut my_string = String::from("Rust");
    change(&mut my_string);
    println!("{}", my_string); // "Rust is amazing!"
}

4. Практический пример: простой калькулятор

Закрепим знания на небольшом проекте. Напишем консольный калькулятор, который принима

Блоги

Рекомендаций по книгам