Newtype Pattern for Type Safety
Wrap primitives in newtypes so distinct identifiers and units cannot be mixed, adding validation and methods without runtime cost.
Code
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Meters(f64);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct Seconds(f64);
#[derive(Debug)]
enum SpeedError {
ZeroDuration,
}
impl Meters {
fn per(self, duration: Seconds) -> Result<f64, SpeedError> {
if duration.0 <= 0.0 {
return Err(SpeedError::ZeroDuration);
}
Ok(self.0 / duration.0)
}
}
fn main() {
let distance = Meters(100.0);
let duration = Seconds(9.58);
match distance.per(duration) {
Ok(speed) => println!("speed = {speed:.2} m/s"),
Err(error) => eprintln!("invalid: {error:?}"),
}
}Report a problem with this exampleOpens a pre-filled issue on GitHub.