ファントム型パラメーター
ファントム型パラメーターとは、実行時には現れないものの、 コンパイル時に静的に(かつ、それだけで)検査される型パラメーターです。
データ型は、追加のジェネリック型パラメーターを使用して、マーカーとして機能させたり、 コンパイル時に型検査を行ったりできます。これらの追加パラメーターは ストレージ値を保持せず、実行時の振る舞いも持ちません。
次の例では、std::marker::PhantomData とファントム型パラメーターの概念を組み合わせて、 異なるデータ型を含むタプルを作成します。
use std::marker::PhantomData; // 隠しパラメーター `B` を持ち、`A` に対してジェネリックなファントムタプル構造体。 #[derive(PartialEq)] // この型に対する等価性テストを許可する。 struct PhantomTuple<A, B>(A, PhantomData<B>); // 隠しパラメーター `B` を持ち、`A` に対してジェネリックなファントム型構造体。 #[derive(PartialEq)] // この型に対する等価性テストを許可する。 struct PhantomStruct<A, B> { first: A, phantom: PhantomData<B> } // 注: ジェネリック型 `A` にはストレージが割り当てられるが、`B` には割り当てられない。 // したがって、`B` は計算に使用できない。 fn main() { // ここでは、`f32` と `f64` が隠しパラメーター。 // PhantomTuple 型は `<char, f32>` として指定される。 let _tuple1: PhantomTuple<char, f32> = PhantomTuple('Q', PhantomData); // PhantomTuple 型は `<char, f64>` として指定される。 let _tuple2: PhantomTuple<char, f64> = PhantomTuple('Q', PhantomData); // 型は `<char, f32>` として指定される。 let _struct1: PhantomStruct<char, f32> = PhantomStruct { first: 'Q', phantom: PhantomData, }; // 型は `<char, f64>` として指定される。 let _struct2: PhantomStruct<char, f64> = PhantomStruct { first: 'Q', phantom: PhantomData, }; // コンパイル時エラー!型が一致しないため、これらは比較できない: // println!("_tuple1 == _tuple2 の結果: {}", // _tuple1 == _tuple2); // コンパイル時エラー!型が一致しないため、これらは比較できない: // println!("_struct1 == _struct2 の結果: {}", // _struct1 == _struct2); }