虚类型参数
虚类型(phantom type)参数是一种在运行时不出现,而在(且仅在)编译时进行静态检查 的类型参数。
可以用额外的泛型类型参数指定数据类型,这类型可以充当标记,也可以供编译时类型检查 使用。这些额外的参数没有存储值,也没有运行时行为。
在下面例子中,我们使用 std::marker::PhantomData 作为虚类型参数的类型,创建 包含不同数据类型的元组。
use std::marker::PhantomData;
// 这个虚元组结构体对 `A` 是泛型的,并且带有隐藏参数 `B`。
#[derive(PartialEq)] // 允许这种类型进行相等测试(equality test)。
struct PhantomTuple<A, B>(A,PhantomData<B>);
// 这个虚类型结构体对 `A` 是泛型的,并且带有隐藏参数 `B`。
#[derive(PartialEq)] // 允许这种类型进行相等测试。
struct PhantomStruct<A, B> { first: A, phantom: PhantomData<B> }
// 注意:对于泛型 `A` 会分配存储空间,但 `B` 不会。
// 因此,`B` 不能参与运算。
fn main() {
// 这里的 `f32` 和 `f64` 是隐藏参数。
// 被指定为 `<char, f32>` 的 `PhantomTuple` 类型。
let _tuple1: PhantomTuple<char, f32> = PhantomTuple('Q', PhantomData);
// 被指定为 `<char, f64>` `PhantomTuple` 类型。
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 yields: {}",
// _tuple1 == _tuple2);
// 编译期错误!类型不匹配,所以这些值不能够比较:
//println!("_struct1 == _struct2 yields: {}",
// _struct1 == _struct2);
}
参见:
当前内容版权归 rust-lang-cn 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 rust-lang-cn .