New Type Idiom
Ідіома newtype дає гарантії під час компіляції, що до програми подається правильний тип значення.
Наприклад, функції, яка вимірює відстань у милях, має бути передане значення типу Miles.
struct Miles(f64);
struct Kilometers(f64);
impl Miles {
pub fn to_kilometers(&self) -> Kilometers {
Kilometers(self.0 * 1.609344)
}
}
impl Kilometers {
pub fn to_miles(&self) -> Miles {
Miles(self.0 / 1.609344)
}
}
fn is_a_marathon(distance: &Miles) -> bool {
distance.0 >= 26.2
}
fn main() {
let distance = Miles(30.0);
let distance_km = distance.to_kilometers();
println!("Is a marathon? {}", is_a_marathon(&distance));
println!("Is a marathon? {}", is_a_marathon(&distance_km.to_miles()));
// println!("Is a marathon? {}", is_a_marathon(&distance_km));
}
Розкоментуйте останній оператор println!, щоб побачити, що поданий тип має бути Miles.
Щоб отримати значення newtype як базовий тип, ви можете використати кортежний синтаксис або синтаксис деструктуризації, ось так:
struct Miles(f64);
fn main() {
let distance = Miles(42.0);
let distance_as_primitive_1: f64 = distance.0; // Tuple
let Miles(distance_as_primitive_2) = distance; // Destructuring
}