有没有办法停止打破递归特质定义?

时间:2017-09-23 18:39:10

标签: rust

我正在尝试为这样的结构(playground)定义通用From实现:

struct Wrapped<T: Clone>(T);

impl<T: Clone, __Into0: ::std::convert::Into<T>> ::std::convert::From<(__Into0)> for Wrapped<T> {
    fn from(original: (__Into0)) -> Wrapped<T> {
        Wrapped(original.into())
    }
}

fn main() {
    let _: Wrapped<i64> = 5i32.into();
} 

但是,我收到以下错误:

error[E0119]: conflicting implementations of trait `std::convert::From<Wrapped<_>>` for type `Wrapped<_>`:
 --> src/main.rs:3:1
  |
3 | / impl<T: Clone, __Into0: ::std::convert::Into<T>> ::std::convert::From<(__Into0)> for Wrapped<T> {
4 | |     fn from(original: (__Into0)) -> Wrapped<T> {
5 | |         Wrapped(original.into())
6 | |     }
7 | | }
  | |_^
  |
  = note: conflicting implementation in crate `core`

我猜这是因为From是为每个类型实现的,而我的新实现还包括一种解决方法。

我不确定如何解决这种类似递归的行为。我能想到的唯一解决方案是使用单个元素元组(playground):

struct Wrapped<T: Clone>(T);

impl<T: Clone, __Into0: ::std::convert::Into<T>> ::std::convert::From<(__Into0,)> for Wrapped<T> {
    fn from(original: (__Into0,)) -> Wrapped<T> {
        Wrapped(original.0.into())
    }
}

fn main() {
    let _: Wrapped<i64> = (5i32,).into();
}

这有效,但它使API比我想要的更尴尬。有没有其他方法可以解决这个编译错误?

0 个答案:

没有答案