2025-02-08
this post will be very short. let's say you have a struct Metrics
struct Seconds(u64);
struct Metrics {
daily_active_users: u64,
average_visit_duration: Seconds
}
and it has a custom ToString implementation
impl ToString for Metrics {
fn to_string(&self) -> String {
format!("dau: {}, mean(visit duration): {}", self.daily_active_users, self.average_visit_duration)
}
}
Time passes, and there is a new metric - origin site.
struct Metrics {
daily_active_usears: u64,
average_visit_duration: Seconds,
origin_site: String
}
Now, when calling .to_string(), origin_site will be left out.
How can we ensure all fields be handled?
impl ToString for Metrics {
fn to_string(&self) -> String {
let Self { daily_active_users, average_visit_duration} = self;
format!("dau: {}, mean(visit duration): {}", daily_active_users, average visit_duration)
}
}
Not explicitly handling the additional field will now result in a compile time error.
Compiling example v0.0.1 (/example)
error[E0027]: pattern does not mention field `origin_site`
--> src/lib.rs:12:7
|
12 | let Self { daily_active_users, average_visit_duration} = self;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing field `origin_site`
|
help: include the missing field in the pattern
|
12 | let Self { daily_active_users, average_visit_duration, origin_site } = self;
| ~~~~~~~~~~~~~~~
help: if you don't care about this missing field, you can explicitly ignore it
|
12 | let Self { daily_active_users, average_visit_duration, origin_site: _ } = self;
| ~~~~~~~~~~~~~~~~~~
help: or always ignore missing fields here
|
12 | let Self { daily_active_users, average_visit_duration, .. } = self;
| ~~~~~~
For more information about this error, try `rustc --explain E0027`.
error: could not compile `example` (lib) due to 1 previous error