Тип Formatter
Тип Formatter представляет собой контекст
форматирования, который передаётся в методы
fmt трейтов Display и Debug.
Он содержит информацию о параметрах форматирования:
ширине, точности, выравнивании, заполнителе и
используемом представлении. Через методы Formatter
можно записывать отформатированные данные в
выходной поток, а также запрашивать текущие
настройки форматирования.
Синтаксис
impl fmt::Display for MyStruct
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
write!(f, "{}", self.value)
}
}
Основные методы типа Formatter:
f.width() -> Option<usize>
f.precision() -> Option<usize>
f.align() -> Option<Alignment>
f.fill() -> char
f.sign_plus() -> bool
f.alternate() -> bool
f.debug_struct(name) -> DebugStruct
f.debug_tuple(name) -> DebugTuple
f.debug_list() -> DebugList
f.debug_map() -> DebugMap
f.debug_set() -> DebugSet
Пример
Давайте реализуем трейт Display для структуры
и используем Formatter для записи значения:
use std::fmt;
struct Point
{
x: i32,
y: i32,
}
impl fmt::Display for Point
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
write!(f, "({}, {})", self.x, self.y)
}
}
fn main()
{
let p = Point { x: 1, y: 2 };
println!("{}", p);
}
Результат выполнения кода:
(1, 2)
Пример
Давайте используем методы width и precision
для получения параметров форматирования:
use std::fmt;
struct Value(i32);
impl fmt::Display for Value
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
let width = f.width().unwrap_or(0);
let precision = f.precision().unwrap_or(0);
write!(f, "width={}, precision={}, value={}", width, precision, self.0)
}
}
fn main()
{
let v = Value(42);
println!("{:10.5}", v);
}
Результат выполнения кода:
width=10, precision=5, value=42
Пример
Давайте используем debug_struct для создания
отладочного представления структуры:
use std::fmt;
struct Point
{
x: i32,
y: i32,
}
impl fmt::Debug for Point
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result
{
f.debug_struct("Point")
.field("x", &self.x)
.field("y", &self.y)
.finish()
}
}
fn main()
{
let p = Point { x: 1, y: 2 };
println!("{:?}", p);
}
Результат выполнения кода:
Point { x: 1, y: 2 }