Стандартная библиотека Rust: полный обзор
Стандартная библиотека Rust (std) — это фундамент, на котором строится любое приложение на этом языке. Она предоставляет набор надёжных, эффективных и безопасных инструментов для решения типовых задач, от работы с коллекциями до низкоуровневого управления памятью. В отличие от многих других языков, стандартная библиотека Rust спроектирована так, чтобы минимизировать зависимость от внешних крейтов (crates) для базовых операций, сохраняя при этом производительность, близкую к C/C++.
Основные модули стандартной библиотеки
Стандартная библиотека организована в логические модули. Рассмотрим ключевые из них:
std::collections— структуры данных:Vec,HashMap,HashSet,BTreeMap,LinkedListи другие.std::io— работа с вводом-выводом: чтение/запись файлов, работа с потоками, буферизация.std::fs— файловая система: создание, удаление, копирование файлов и директорий.std::thread— многопоточность: создание потоков, синхронизация черезMutex,Arc.std::sync— примитивы синхронизации: каналы (mpsc), барьеры, семафоры.std::net— сетевое программирование: TCP/UDP сокеты, адреса.std::time— работа со временем: замеры, таймеры, длительности.std::mem— управление памятью: размеры типов, выравнивание,swap,replace.
Коллекции: от Vec до HashMap
Коллекции в Rust — это не просто контейнеры. Они реализуют богатый API и гарантируют безопасность памяти на этапе компиляции. Самой популярной коллекцией является Vec<T> — динамический массив.
fn main() {
let mut numbers: Vec<i32> = vec![1, 2, 3, 4];
numbers.push(5);
// Итерация с изменением
for num in &mut numbers {
*num *= 2;
}
// Фильтрация
let evens: Vec<&i32> = numbers.iter()
.filter(|&&x| x % 2 == 0)
.collect();
println!("{:?}", evens); // [2, 4, 6, 8, 10]
}
HashMap — ассоциативный массив с хешированием. Важно отметить, что по умолчанию используется криптостойкий хеш-алгоритм (SipHash), что предотвращает атаки типа HashDoS.
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Alice"), 100);
scores.insert(String::from("Bob"), 85);
// Безопасное получение значения
match scores.get(&String::from("Alice")) {
Some(score) => println!("Score: {}", score),
None => println!("Not found"),
}
// Обход с итератором
for (name, score) in &scores {
println!("{}: {}", name, score);
}
}
Работа с вводом-выводом и файлами
Модуль std::io предоставляет как высокоуровневые, так и низкоуровневые средства для работы с потоками данных. Особого внимания заслуживает типаж Read и Write.
use std::fs::File;
use std::io::{self, Read, Write};
fn read_file(path: &str) -> io::Result<String> {
let mut file = File::open(path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
Ok(contents)
}
fn write_file(path: &str, data: &str) -> io::Result<()> {
let mut file = File::create(path)?;
file.write_all(data.as_bytes())?;
Ok(())
}
fn main() -> io::Result<()> {
write_file("example.txt", "Hello, Rust!")?;
let content = read_file("example.txt")?;
println!("{}", content);
Ok(())
}
Многопоточность: безопасная работа с потоками
Одно из главных преимуществ Rust — гарантия отсутствия гонок данных (data races) на этапе компиляции. Стандартная библиотека предоставляет все необходимые прими