問題一覧に戻る
上級高度な型
問題102: Newtypeパターン応用
Newtypeパターンは既存の型を新しい型でラップし、型安全性を向上させます。タプル構造体で実装され、内部値へのゼロコストアクセスを提供。異なる単位や意味を持つ値を型レベルで区別でき、誤った使用をコンパイル時に防ぎます。トレイト実装により演算子オーバーロードや型変換を定義でき、直感的なAPIを構築できます。
use std::ops::Add;
// Newtypeパターン
struct Meters();
struct Kilometers(f64);
// Display実装
impl std::fmt::Display for Meters {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}m", self.)
}
}
// 型変換
impl From<Kilometers> for Meters {
fn from(km: Kilometers) -> Self {
Meters(km.0 * )
}
}
// 加算実装
impl Add for Meters {
type Output = ;
fn add(self, other: Self) -> Self::Output {
Meters(self.0 + other.0)
}
}
fn main() {
let distance1 = Meters(100.0);
let distance2 = Kilometers(0.5);
let total = distance1 + distance2.();
println!("Total distance: {}", total);
}