Найти в Дзене

Основы языка программирования 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. - Переменные по умолчанию неизменяе
Оглавление

Введение в 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 требует времени для освоения, но вложенные усилия окупаются созданием быстрого и безопасного кода. Удачи в изучении! 🦀

Подписывайтесь:

Телеграм https://t.me/lets_go_code
Канал "Просто о программировании"
https://dzen.ru/lets_go_code