write!(f, "x: {}, y: {}", self.x, self.y)
}
}
fn main() {
let minmax = MinMax(0, 14);
println!("Сравниваем структуры:");
println!("Display: {}", minmax);
println!("Debug: {:?}", minmax);
let big_range = MinMax(-300, 300);
let small_range = MinMax(-3, 3);
println!("Большой диапазон - {big} и маленький диапазон {small}",
small = small_range,
big = big_range);
let point = Point2D { x: 3.3, y: 7.2 };
println!("Сравниваем точки:");
println!("Display: {}", point);
println!("Debug: {:?}", point);
// Ошибка. Типажи `Debug` и `Display` были реализованы, но `{:b}`
// необходима реализация `fmt::Binary`. Следующий код не сработает.
// println!("Как выглядит Point2D в виде двоичного кода: {:b}?", point);
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Итак, fmt::Display был реализован, но fmt::Binary нет, следовательно не может быть использован. std::fmt имеет много таких типажей и каждый из них требует свою реализацию. Это более подробно описано в документации к std::fmt.
После того, как запустите код, представленный выше, используйте структуру Point2D как пример и добавьте новую структуру Complex, чтобы вывод был таким:
Display: 3.3 +7.2i
Debug: Complex { real: 3.3, imag: 7.2 }
derive, std::fmt, макросы, struct, trait и use
Реализовать fmt::Display для структуры, в которой каждый элемент должен обрабатываться последовательно не так то просто. Проблема в том, что write! каждый раз возвращает fmt::Result. Для правильного обращения с этим необходимо обрабатывать
Использование ? для write! выглядит следующим образом:
write!(f, "{}", value)?;
С помощью оператора ? реализация fmt::Display для Vec довольно простая:
use std::fmt; // Импортируем модуль `fmt`.
// Определим структуру с именем `List`, которая хранит в себе `Vec`.
struct List(Vec
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// Получаем значение с помощью индекса кортежа
// и создаём ссылку на `vec`.
let vec = &self.0
write!(f, "[")?;
// Пройдёмся по каждому `v` в `vec`.
// Номер итерации хранится в `count`.
for (count, v) in vec.iter().enumerate() {
// Для каждого элемента, кроме первого, добавим запятую
// до вызова `write!`. Используем оператор `?` или `try!`,
// чтобы вернуться при наличие ошибок.
if count != 0 { write!(f, ", ")?; }