Rust на примерах

1.2.1 Debug

Все типы, которые будут использовать типажи (traits) форматирования std::fmt требуют их реализации для возможности печати. Автоматическая реализация предоставлена только для типов из стандартной библиотеки (std). Все остальные типы должны иметь собственную реализацию.

C помощью типажа fmt::Debug это сделать очень просто. Все типы могут выводить (derive) (автоматически создавать) реализацию fmt::Debug. Сделать подобное с fmt::Display невозможно, он должен быть реализован вручную.

// Эта структура не может быть напечатана с помощью `fmt::Display` 
// или с помощью `fmt::Debug`
struct UnPrintable(i32);

// Атрибут `выводить (derive)` автоматически реализует
// необходимые методы, чтобы была возможность 
// печатать данную `структуру` с помощью `fmt::Debug`.
#[derive(Debug)]
struct DebugPrintable(i32);

Все типы в стандартной библиотеке (std) могут быть напечатаны с {:?}:

// Вывод и реализация `fmt::Debug` для `Structure`. `Structure`
// `Structure` - это структура, которая содержит в себе один `i32`.
#[derive(Debug)]
struct Structure(i32);

// Добавим структуру `Structure` в структуру `Deep`. 
// Релазиуем для `Deep` возможность вывода с помощью fmt::Debug`.
#[derive(Debug)]
struct Deep(Structure);

fn main() {
    // Printing with `{:?}` is similar to with `{}`.
    // Вывод с помощью `{:?}` аналогичен `{}`.
    println!("{:?} months in a year.", 12);
    println!("{1:?} {0:?} is the {actor:?} name.",
             "Slater",
             "Christian",
             actor="actor's");

    // `Structure` теперь можно напечатать!
    println!("Now {:?} will print!", Structure(3));

    // Проблема с `выводом (derive)`, в том, что у нас не будет контроля
    // над тем, как будет выглядить результат. 
    // Что если мы хотим напечатать просто `7`?
    println!("Now {:?} will print!", Deep(Structure(7)));
}

fmt::Debug дает возможность выводить информацию о обьектах на экран, жертвуя при этом элегантностью. Реализовав типаж fmt::Display вручную можно исправить это.

Смотрите также

attributes, derive, std::fmt, и struct