New Typeイディオム
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)); }
最後のprint文のコメントを解除すると、渡す型はMilesでなければならないことを確認できます。
newtypeの値を基底型として取得するには、次のようにタプル構文または分配束縛構文を使用できます。
struct Miles(f64); fn main() { let distance = Miles(42.0); let distance_as_primitive_1: f64 = distance.0; // タプル let Miles(distance_as_primitive_2) = distance; // 分配束縛 }