Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ファントム型パラメーター

ファントム型パラメーターとは、実行時には現れないものの、 コンパイル時に静的に(かつ、それだけで)検査される型パラメーターです。

データ型は、追加のジェネリック型パラメーターを使用して、マーカーとして機能させたり、 コンパイル時に型検査を行ったりできます。これらの追加パラメーターは ストレージ値を保持せず、実行時の振る舞いも持ちません。

次の例では、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);
}

関連項目:

Derivestruct、および tuple