与AsRef和From实现冲突的实现

时间:2018-01-17 13:54:32

标签: rust

MyClass只是一个字节数组。由于我希望与MyClass之间进行灵活的转换,因此我将From实施为From<T> for MyClass where T: AsRef<[u8]>。这是有效的,但是一旦我实现了相应的AsRef<[u8]> for MyClass,我就会得到一个相互冲突的实现&#34;错误。

use std::convert::{AsRef, From};

const MY_SIZE: usize = 32;

pub struct MyClass(pub [u8; MY_SIZE]);

impl AsRef<[u8]> for MyClass {
    fn as_ref(&self) -> &[u8] {
        &self.0
    }
}

impl<T> From<T> for MyClass
where
    T: AsRef<[u8]>,
{
    fn from(byteable: T) -> Self {
        let bytes: &[u8] = byteable.as_ref();
        assert_eq!(bytes.len(), MY_SIZE);
        let mut dst: [u8; MY_SIZE] = [0; MY_SIZE];
        dst.copy_from_slice(&bytes);
        MyClass(dst)
    }
}

fn main() {}
error[E0119]: conflicting implementations of trait `std::convert::From<MyClass>` for type `MyClass`:
  --> src/main.rs:13:1
   |
13 | / impl<T> From<T> for MyClass
14 | | where
15 | |     T: AsRef<[u8]>,
16 | | {
...  |
23 | |     }
24 | | }
   | |_^
   |
   = note: conflicting implementation in crate `core`:
           - impl<T> std::convert::From<T> for T;

我可以避免错误,还是有更好的方法来设计这个库?

0 个答案:

没有答案