Rust на примерах - страница 3
>
>}
>הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
std::fmt содержит в себе много типажей, которые управляют отображением текста. Базовая форма двух самых важных рассмотрена ниже:
• fmt::Debug: Использует маркер {:?}. Форматирует текст для отладочных целей.
• fmt::Display: Использует маркер {}. Форматирует текст в более элегантном,удобном для пользователя стиле.
В данном примере используется fmt::Display, потому что стандартная библиотека предоставляет реализацию для данного типа. Для отображения собственных типов потребуется больше дополнительных шагов.
Реализация типажа fmt::Display автоматически предоставляет реализацию типажа ToString, который позволяет нам конвертировать наш тип в String.
• Исправьте две ошибки в коде выше (смотрите ИСПРАВЬТЕ), чтобы код компилировался без ошибок
• Добавьте макрос println!, который выводит: Pi is roughly 3.142 с помощью управления количеством знаков после запятой. Для выполнения данного задания создайте переменную, которая будет хранить в себе значение числа Пи: let pi = 3.141592. (Подсказка: вам необходимо ознакомиться с документацией по std::fmt, чтобы узнать, как отобразить в консоли только часть знаков после запятой).
std::fmt, макросы, struct, и trait
Все типы, которые будут использовать типажи форматирования std::fmt требуют их реализации для возможности печати. Автоматическая реализация предоставлена только для типов из стандартной библиотеки (std). Все остальные типы должны иметь собственную реализацию.
C помощью типажа fmt::Debug это сделать очень просто. Все типы могут выводить (автоматически создавать, derive) реализацию fmt::Debug. Сделать подобное с fmt::Display невозможно, он должен быть реализован вручную.
>#![allow(unused)]
>fn main() {
>// Эта структура не может быть напечатана с помощью `fmt::Display`
>// или с помощью `fmt::Debug`
>struct UnPrintable(i32);
>// Атрибут `derive` автоматически реализует
>// необходимые методы, чтобы была возможность
>// печатать данную `структуру` с помощью `fmt::Debug`.
>#[derive(Debug)]
>struct DebugPrintable(i32);
>}
Все типы в стандартной библиотеке (std) могут быть напечатаны с {:?}:
>// Вывод и реализация `fmt::Debug` для `Structure`.
>// `Structure` - это структура, которая содержит в себе один `i32`.
>#[derive(Debug)]
>struct Structure(i32);
>// Добавим структуру `Structure` в структуру `Deep`.
>// Реализуем для `Deep` возможность вывода с помощью fmt::Debug`.
>#[derive(Debug)]
>struct Deep(Structure);
>fn main() {
>// Вывод с помощью `{:?}` аналогичен `{}`.
>println!("{:?} месяцев в году.", 12);
>println!("{1:?} {0:?} - это имя {actor:?}.",
>"Слэйтер",
>"Кристиан",
>actor="актёра");
>// `Structure` теперь можно напечатать!
>println!("Теперь {:?} будет выведена на экран!", Structure(3));
>// Проблема с `выводом (derive)`, в том, что у нас не будет контроля
>// над тем, как будет выглядеть результат.
>// Что если мы хотим напечатать просто `7`?
>println!("А теперь напечатаем {:?}", Deep(Structure(7)));
>}
>הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Так что fmt:: Debug определённо делает это для печати, но жертвует некоторыми изящество. Rust также обеспечивает "красивую печать" с помощью {:#?}.