Onizuka

программирование #rust #системноепрограммирование #безопасность

Rust — это современный язык системного программирования, который изначально создавался Mozilla, а теперь поддерживается огромным сообществом. Он разрабатывался как решение главных проблем C и C++: безопасности памяти и конкурентности. Главная фишка Rust заключается в том, что он гарантирует безопасность памяти на этапе компиляции без использования сборщика мусора. Это делает его невероятно быстрым и надежным инструментом.

Давайте посмотрим, как основные концепции Rust работают на практике.

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

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

Вот простой пример работы со структурами и методами:

// Определяем структуру
struct User {
    username: String,
    active: bool,
}

impl User {
    // Метод для создания нового пользователя
    fn new(username: &str) -> Self {
        User {
            username: String::from(username),
            active: true,
        }
    }

    // Метод для деактивации (берет изменяемую ссылку)
    fn deactivate(&mut self) {
        self.active = false;
    }
}

fn main() {
    let mut user = User::new("dev_rust");
    println!("Пользователь {} активен: {}", user.username, user.active);

    user.deactivate();
    println!("Пользователь {} активен: {}", user.username, user.active);
}

Enter fullscreen mode Exit fullscreen mode

Обратите внимание на &mut self в методе deactivate: это заимствование с возможностью изменения. Компилятор гарантирует, что в момент вызова этого метода никто другой не имеет доступа к user.

Обработка ошибок

В Rust нет исключений в привычном понимании. Вместо этого используются типы Result и Option, что заставляет разработчика явно обрабатывать возможные ошибки или отсутствие значения. Это делает код максимально предсказуемым.

fn divide(a: i32, b: i32) -> Result<i32, String> {
    if b == 0 {
        Err(String::from("Деление на ноль"))
    } else {
        Ok(a / b)
    }
}

fn main() {
    match divide(10, 0) {
        Ok(result) => println!("Результат: {}", result),
        Err(e) => println!("Ошибка: {}", e),
    }
}

Enter fullscreen mode Exit fullscreen mode

Вывод

Rust может показаться сложным из-за строгого компилятора (borrow checker), который часто "ругается" на код, заставляя переписывать логику. Однако эта строгость окупается сполна: программы на Rust работают молниеносно и практически не падают в рантайме из-за утечек памяти или гонок данных.

В сочетании с отличным менеджером пакетов Cargo, встроенными тестами и удобным форматированием кода, Rust становится идеальным выбором для создания высоконагруженных систем, бэкенд-сервисов, WASM-приложений и утилит командной строки. Если вы цените производительность и безопасность, и еще не пробовали Rust — самое время начать!