問題一覧に戻る
上級ジェネリクス
問題97: ファントム型

PhantomDataは構造体フィールドに現れない型パラメータの使用を可能にします。これによりコンパイル時に型が不変条件を強制する型レベルプログラミングが可能になります。一般的な用途には単位型、状態マシン、ライフタイム変性があります。PhantomDataは実行時コストがゼロで、純粋に型システムのためのものです。このパターンは型安全性により非互換な値の混合を防ぎます。

use std::marker::;

// ファントム型を持つ構造体
struct Meter<T> {
value: f64,
_unit: (T),
}

// 単位マーカー型
struct Kilometers;
struct Miles;

// 型安全な変換
impl Meter<Kilometers> {
fn to_miles(self) -> Meter<> {
Meter {
value: self.value * 0.621371,
_unit: ,
}
}
}

fn main() {
let km = Meter::<> {
value: 5.0,
_unit: PhantomData,
};

let mi = km.to_miles();
println!("{} miles", mi.value);
}