rust 当< T>< U>T -&gt; U用From定义时,惯用的Option到Option

xxhby3vn  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(95)

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

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;
yeotifhr

yeotifhr1#

是的,有一个原因,因为它与impl<T> From<T> for T冲突,正如你在case T == U中注意到的那样。就像你不能写这个impl一样,std也不能(即使是当前的专门化也不支持这个,并且专门化不用于公共接口)。有这样的impl(和其他类型的类似impl)的愿望,只是不清楚如何做到这一点。

相关问题