Debugging a struct in Rust
In writing this short Rust program:
struct Person {
name: String,
age_in_years: u32,
}
fn main() {
let prince = Person {
name: String::from("Prince"),
age_in_years: 100,
};
dbg!(prince);
}
I came across an error I hadn’t seen in a long time so I forgot why it came up and also how to fix it:
11 | dbg!(prince);
| ^^^^^^^^^^^^^ `Person` cannot be formatted using `{:?}`
Fortunately, Rust gives us hints on how to fix this:
= help: the trait `std::fmt::Debug` is not implemented for `Person`
= note: add `#[derive(Debug)]` or manually implement `std::fmt::Debug`
= note: required because of the requirements on the impl of `std::fmt::Debug` for `&Person`
So, the short answer to fix this is we need to add #[derive(Debug)]
onto our
struct Person
, resulting in:
#[derive(Debug)]
struct Person {
name: String,
age_in_years: u32,
}
Alternatively, we could also do their other suggestion and implement the trait for
struct our struct manually. That means we’d need to implement fmt::Debug for Person
.
And one of its requirements is that we have a function fmt
that describes how to output
it to the terminal:
use std::fmt;
struct Person {
name: String,
age_in_years: u32
}
impl fmt::Debug for Person {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Point")
.field("name", &self.name)
.field("age_in_years", &self.age_in_years)
.finish()
}
}
If we wanted to do any customization to how to output it for our user, we can also
do that but this is what gets generated for us using #[derive(Debug)]
.