Трейт Debug
Трейт Debug из модуля std::fmt
позволяет выводить значение в отладочном формате.
Он используется совместно с плейсхолдером {:?}
в макросах форматирования, таких как println!,
format! и dbg!. Реализация этого трейта
обычно выполняется автоматически с помощью атрибута
#[derive(Debug)]. Параметром метод fmt
принимает изменяемую ссылку на объект Formatter,
который управляет процессом форматирования.
Синтаксис
#[derive(Debug)]
struct MyStruct;
impl fmt::Debug for MyStruct
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
{
// ...
}
}
Пример
Давайте выведем на экран кортеж с помощью
плейсхолдера {:?}:
fn main()
{
let res = (1, "abcde", 3.14);
println!("{:?}", res);
}
Результат выполнения кода:
(1, "abcde", 3.14)
Пример
Давайте создадим собственную структуру и
автоматически реализуем для неё трейт Debug
с помощью атрибута #[derive(Debug)]:
#[derive(Debug)]
struct Point
{
x: i32,
y: i32,
}
fn main()
{
let res = Point { x: 1, y: 2 };
println!("{:?}", res);
}
Результат выполнения кода:
Point { x: 1, y: 2 }
Пример
Давайте используем плейсхолдер {:#?}
для красивого многострочного вывода структуры:
#[derive(Debug)]
struct Point
{
x: i32,
y: i32,
}
fn main()
{
let res = Point { x: 1, y: 2 };
println!("{:#?}", res);
}
Результат выполнения кода:
Point {
x: 1,
y: 2,
}
Пример
Давайте реализуем трейт Debug вручную
для собственной структуры:
use std::fmt;
struct Point
{
x: i32,
y: i32,
}
impl fmt::Debug for Point
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
{
write!(f, "Point({}, {})", self.x, self.y)
}
}
fn main()
{
let res = Point { x: 1, y: 2 };
println!("{:?}", res);
}
Результат выполнения кода:
Point(1, 2)
Смотрите также
-
плейсхолдер
placeholder-debug,
который используется для вывода в отладочном формате -
плейсхолдер
placeholder-pretty,
который выводит значение в улучшенном отладочном формате -
трейт
Display,
который отвечает за пользовательское форматирование вывода -
макрос
dbg!,
который выводит отладочную информацию вместе с именем выражения