Введение: Почему 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. Практический пример: простой калькулятор
Закрепим знания на небольшом проекте. Напишем консольный калькулятор, который принима