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)]
.