#send-sync #phantom #variance #inheritance #control #rich #type

rich-phantoms

控制方差和sync/sync继承的Phantom类型

1个不稳定版本

0.1.0 2019年1月27日

#7#phantom


2 crates 使用

MIT/Apache

8KB

Rich Phantoms

Rust中控制方差和send/sync继承的Phantom类型实现

它们都是对 PhantomData 的类型别名,因此可以在 const 和非大小上下文中使用。

简介

PhantomData<T>协变的,并且只有当 TSend+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.0许可证的定义,应作为上述双重许可证使用,不附加任何额外条款或条件。

无运行时依赖