Основы языка программирования Rust

Основы языка программирования Rust


Основы языка программирования Rust

Введение в Rust

Rust — это современный язык системного программирования, созданный для обеспечения безопасности, скорости и параллелизма. Разработанный в Mozilla, он сочетает низкоуровневый контроль над памятью с высокоуровневыми абстракциями, что делает его идеальным для задач, где важны производительность и надежность.

Ключевые особенности Rust:

  • Безопасность памяти без использования сборщика мусора.
  • Система владения (ownership) для управления ресурсами.
  • Статическая типизация с выводом типов.
  • Алгебраические типы данных (например, Option и Result).
  • Многопоточность без гонок данных благодаря строгим правилам времени жизни и заимствования.

Rust популярен в системном программировании, разработке веб-ассембли, embedded-системах и инструментах командной строки.


Установка и настройка

  1. Установите Rust через rustup:
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  2. Проверьте установку:
    rustc --version
    cargo --version
    cargo — это менеджер пакетов и системы сборки Rust.

Синтаксис и базовые концепции

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

  • Переменные по умолчанию неизменяемы.
  • Используйте mut для изменяемых переменных.
    let x = 5;       // Неизменяемая
    let mut y = 10;  // Изменяемая
    y = 15;          // OK
    // x = 7;        // Ошибка компиляции!

2. Типы данных

  • Скалярные типы: i32, u64, f64, bool, char.
  • Составные типы: кортежи, массивы.
    let tuple: (i32, f64, char) = (42, 3.14, 'R');
    let arr: [i32; 3] = [1, 2, 3];

3. Функции

  • Используйте fn для объявления.
  • Возвращаемое значение указывается после ->.
    fn add(a: i32, b: i32) -> i32 {
        a + b  // Нет точки с запятой — это выражение возвращает значение
    }

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

  • Условные операторы:
    let number = 7;
    if number < 5 {
        println!("Меньше 5");
    } else {
        println!("Больше или равно 5");
    }
  • Циклы:
    for i in 1..5 {  // Диапазон 1-4
        println!("{}", i);
    }
    
    let mut count = 0;
    loop {
        count += 1;
        if count == 3 { break; }
    }

Система владения (Ownership)

Владение — уникальная особенность Rust, гарантирующая безопасность памяти.

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

  1. У каждого значения есть владелец (переменная).
  2. Только один владелец в каждый момент времени.
  3. При выходе владельца из области видимости, значение удаляется.

Пример:

let s1 = String::from("hello");
let s2 = s1;  // s1 больше не действителен — владение передано s2
// println!("{}", s1); // Ошибка!

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

  • Ссылки (&) позволяют использовать значение без передачи владения.
  • Неизменяемые ссылки: можно иметь сколько угодно.
  • Изменяемые ссылки: только одна на область видимости.
    let s = String::from("hello");
    let len = calculate_length(&s);  // Неизменяемая ссылка
    
    fn calculate_length(s: &String) -> usize {
        s.len()
    }
    
    let mut s = String::from("hi");
    change(&mut s);  // Изменяемая ссылка
    
    fn change(s: &mut String) {
        s.push_str(", world");
    }

Время жизни (Lifetimes)

  • Гарантируют, что ссылки действительны до их использования.
  • Аннотируются символом 'a.
    fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
        if x.len() > y.len() { x } else { y }
    }

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

Rust использует типы Result<T, E> и Option<T> для обработки ошибок.

  • Option<T>: Some(T) или None.
  • Result<T, E>: Ok(T) или Err(E).
    fn divide(a: f64, b: f64) -> Result<f64, String> {
        if b == 0.0 { Err(String::from("Деление на ноль")) }
        else { Ok(a / b) }
    }
    
    match divide(4.0, 2.0) {
        Ok(result) => println!("Результат: {}", result),
        Err(e) => println!("Ошибка: {}", e),
    }

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

  • Структуры группируют данные:

    struct User {
        username: String,
        email: String,
        sign_in_count: u64,
    }
    
    let user = User {
        email: String::from("user@example.com"),
        username: String::from("user"),
        sign_in_count: 1,
    };
  • Перечисления (Enums):

    enum IpAddr {
        V4(u8, u8, u8, u8),
        V6(String),
    }
    
    let home = IpAddr::V4(127, 0, 0, 1);

Модули и пакеты (Cargo)

  • Cargo.toml — файл конфигурации для зависимостей.
  • Модули организуют код в иерархии:
    mod sound {
        pub mod instrument {
            pub fn guitar() { /* ... */ }
        }
    }
    
    fn main() {
        sound::instrument::guitar();
    }

Заключение

Rust предлагает уникальное сочетание безопасности, производительности и современных возможностей. Его система владения и строгий компилятор предотвращают множество ошибок на этапе компиляции, что делает программы надежными.

Следующие шаги:

  1. Изучите The Rust Book.
  2. Практикуйтесь на Rustlings.
  3. Исследуйте крейты (пакеты) на crates.io.

Rust требует времени для освоения, но вложенные усилия окупаются созданием быстрого и безопасного кода. Удачи в изучении! 🦀