Глава 18: Обзор стандартной библиотеки

Раздел 14: Примеры

Содержание: 1. Кастомный вывод структуры с использованием std::fmt 2. Пример работы с std::collections и std::fs Заключение

В этом разделе мы рассмотрим практические примеры использования стандартной библиотеки Rust. Мы сосредоточимся на двух ключевых аспектах:


1. Кастомный вывод структуры с использованием std::fmt

Модуль std::fmt позволяет настроить форматирование вывода для пользовательских типов данных. Рассмотрим пример с реализацией трейтов Display и Debug.

use std::fmt;

// Определяем структуру
struct Person {
    name: String,
    age: u32,
}

// Реализация трейта Debug (автоматически через derive или вручную)
#[derive(Debug)] // Автоматическая реализация для отладки
struct PersonAutoDebug {
    name: String,
    age: u32,
}

// Ручная реализация Display
impl fmt::Display for Person {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        // Форматируем строку как "Имя: <name>, Возраст: <age>"
        write!(f, "Имя: {}, Возраст: {}", self.name, self.age)
    }
}

fn main() {
    let person = Person {
        name: String::from("Алексей"),
        age: 30,
    };
    let person_auto = PersonAutoDebug {
        name: String::from("Мария"),
        age: 25,
    };

    // Вывод с Display
    println!("{}", person); // Имя: Алексей, Возраст: 30

    // Вывод с Debug (автоматический)
    println!("{:?}", person_auto); // PersonAutoDebug { name: "Мария", age: 25 }
}
    

Объяснение:

Практический совет: Используйте Debug для отладки, а Display для вывода, предназначенного для пользователей.


2. Пример работы с std::collections и std::fs

Теперь рассмотрим пример, объединяющий работу с коллекциями (HashMap) и файловой системой (std::fs).

use std::collections::HashMap;
use std::fs;
use std::io;

fn main() -> io::Result<()> {
    // Читаем файл
    let content = fs::read_to_string("input.txt")
        .unwrap_or_else(|_| String::from("Файл не найден, начнём с пустого текста"));

    // Подсчитываем слова
    let mut word_count: HashMap<String, u32> = HashMap::new();
    for word in content.split_whitespace() {
        *word_count.entry(word.to_string()).or_insert(0) += 1;
    }

    // Формируем результат
    let mut output = String::new();
    for (word, count) in &word_count {
        output.push_str(&format!("Слово: {}, Частота: {}\n", word, count));
    }

    // Записываем в файл
    fs::write("output.txt", &output)?;

    println!("Результат записан в output.txt");
    Ok(())
}
    

Объяснение:

Пример ввода (input.txt):

Rust Rust Python Rust Java
    

Вывод (output.txt):

Слово: Rust, Частота: 3
Слово: Python, Частота: 1
Слово: Java, Частота: 1
    

Практический совет: Для больших файлов используйте BufReader вместо read_to_string для повышения производительности.


Заключение

В этом разделе мы изучили, как использовать std::fmt для кастомного вывода, std::collections для работы с данными и std::fs для операций с файлами. Эти инструменты являются основой для большинства программ на Rust.