#bounds #generic #specialization #type

nightly negative-type-bound

提供负类型界限

1 个不稳定版本

0.1.0 2022 年 1 月 10 日

2788Rust 模式

MIT 许可协议

4KB

crates.io

此 crate 使用功能 negative_impls 和 auto_traits

你可能想要做类似的事情

struct Foo<T>(T);

impl<T: From<U>, U> From<Foo<U>> for Foo<T> {
    fn from(v: Foo<U>) -> Self {
        Self(T::from(v.0))
    }
}

但它不会工作,因为它与 impl<T> From<T> for T {} 提供的实现冲突。

所以我们必须对 Foo<T> != Foo<U> 进行界限

此 crate 提供了 NotEqual 特性

(T, U): NotEqual 等价于 T != U

所以这会工作

struct Foo<T>(T);

impl<T: From<U>, U> From<Foo<U>> for Foo<T> where (Foo<T>, Foo<U>): NotEqual {
    fn from(v: Foo<U>) -> Self {
        Self(T::from(v.0))
    }
}

更简单...

struct Foo<T>(T);

impl<T: From<U>, U> From<Foo<U>> for Foo<T> where (T, U): NotEqual {
    fn from(v: Foo<U>) -> Self {
        Self(T::from(v.0))
    }
}

此 crate 还提供了 Equal

无运行时依赖