問題一覧に戻る
上級高度な型
問題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);
}