1个不稳定版本
0.1.0 | 2019年1月27日 |
---|
#7 在 #phantom
被 2 crates 使用
8KB
Rich Phantoms
Rust中控制方差和send/sync继承的Phantom类型实现
它们都是对 PhantomData
的类型别名,因此可以在 const
和非大小上下文中使用。
简介
PhantomData<T>
是 协变的,并且只有当 T
是 Send+Sync
时,它才是。这可能不是你想要的语义——因为它是无大小的,所以它是安全的,可以使其send/sync,或者你可能根本不希望send/sync。如果你的数据类型是反变(contravariant)的,那么你也无法使用 PhantomData<T>
。
这个库提供了Phantom类型,允许你指定你想要的方差和send/sync继承。有关更多详细信息,请参阅这个讨论。
欢迎提出建议和贡献!
示例
在这里,你可以看到非send/sync的内部类型不会影响包装类型,并且 'const
生命周期会被转换成 'a
生命周期。
fn main() {
let x: PhantomCovariantAlwaysSendSync<*const ()> = PhantomData;
fn f<'a>(_: PhantomCovariantAlwaysSendSync<&'a ()>) {}
f(x);
let _y: &(dyn Send + Sync) = &x;
}
这里是相反的例子,一个send/sync的内部类型和一个反变、永不继承的Phantom类型——'a
生命周期会被转换成 'static
生命周期。
fn main() {
fn s(_: PhantomContravariantNeverSendSync<&'static ()>) {}
fn f<'a>() {
let x: PhantomContravariantAlwaysSendSync<&'a ()> = PhantomData;
// let _y: &(dyn Send + Sync) = &x; COMPILE ERROR
s(x); // WORKS
}
}
测试
对这个库的所有变体都有测试,证明了send/sync继承(包括当Phantom类型不应该send/sync时的编译失败测试),以及(正面的)测试了正确的方差类型。
此外,还有一个受功能控制的测试,在以下代码下运行:-Z force-unstable-if-unmarked
,#![feature(staged_api)]
,以及#![feature(const_fn)]
。要运行此测试,请在夜间使用(命令行):cargo test --features unstable-test
。
许可证
许可协议为以下之一
- Apache许可证第2版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
您可选择其中之一。
贡献
除非您明确表示,否则您有意提交的任何贡献,根据Apache-2.0许可证的定义,应作为上述双重许可证使用,不附加任何额外条款或条件。