给出两个任意大小的类型TU,其中U: From<T>,标准库为什么不为From<Option<T>> for Option<U>提供where U: From<T>?我试图这样做,但得到了一个冲突的实现错误,所以显然有一个限制,只是不确定在哪里.是的,我知道我可以用Option::map()来做到这一点,但似乎性病应该开箱即用.

enum Opt<T> {
    Some(T),
    None,
}

impl<T: From<U>, U> From<Opt<T>> for Opt<U> {
    fn from(opt: Opt<T>) -> Self {
        match opt {
            Opt::Some(t) => Opt::Some(t.into()),
            Opt::None => Opt::None,
        }
    }
}

struct A;
struct B;

impl From<A> for B {
    fn from(_: A) -> Self {
        B
    }
}

fn main() {
    let a = Opt::Some(A);
    let _b: Opt<B> = a.into();
}

误差率

error[E0119]: conflicting implementations of trait `From<Opt<_>>` for type `Opt<_>`
 --> src/bin/main.rs:6:1
  |
6 | impl<T: From<U>, U> From<Opt<T>> for Opt<U> {
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: conflicting implementation in crate `core`:
          - impl<T> From<T> for T;

推荐答案

是的,这是有原因的,因为它与你在Case T == U中注意到的impl<T> From<T> for T相冲突.就像您不能编写这种Impl一样,STD也不能(即使是当前的专门化也不支持这一点,专门化也不用于公共接口).有这样的Impl(以及其他类型的类似隐含)的愿望,只是不清楚如何做到.

Rust相关问答推荐

如何初始化match声明中的两个变量而不会激怒borrow 判断器?

什么是谓词的简短和简洁类型

收集RangeInclusive T到Vec T<><>

使用Rust s serde_json对混合数据类型进行优化'

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

异步FN中的 rust 递归

原始数组数据类型的默认trait实现

告诉Rust编译器返回值不包含构造函数中提供的引用

字段类型为Boxed的 struct 的生存期必须超过static

Trait bound i8:来自u8的不满意

在什么情况下 `..._or()` 比 `..._or_else(|| {})` 更好,为什么?

Rust Option 的空显式泛型参数

在 Bevy 项目中为 TextureAtlas 精灵实施 NearestNeighbor 的正确方法是什么?

无法理解 Rust 对临时值的不可变和可变引用是如何被删除的

Rust 将特性传递给依赖项

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

为什么我可以从读取的可变自引用中移出?

`if let` 只是另一种编写其他 `if` 语句的方式吗?

为什么 `ref` 会导致此示例*取消引用*一个字段?