【问题标题】:Conflicting trait implementations for types that clearly already implement the trait显然已经实现特征的类型的冲突特征实现
【发布时间】:2021-11-22 01:58:06
【问题描述】:

我正在使用 webassembly,所以我需要获取指向缓​​冲区的指针。在T 只是AsRef<[f32]> 的情况下(也就是说,如果我理解正确,它可以转换为切片),我已经这样解决了:

#[derive(TS, Serialize)]
pub struct PtrBufF32(usize);

impl<T> From<T> for PtrBufF32
    where T: AsRef<[f32]>
{
    fn from(f32arr: T) -> Self {
        let slc: &[f32] = f32arr.as_ref();
        let ptr: *const f32 = slc.as_ptr();
        Self(ptr as usize)
    }
}

我得到了另一个堆栈溢出用户的帮助来了解发生了什么——据我所知,这意味着“对于任何可以转换为 &amp;[f32] 的引用的 T(即slice),那么我们就可以实现这个 trait。结果当然只是指向 slice 开头的指针。

但是除了实现可以表示为&amp;[f32] 的任何事物之外,我们还需要实现任何可以用&amp;[f32] 表示的事物的集合。比如,如果我的类型T 实现Into&lt;&amp;[f32]&gt;,那么我可以实现任何AsRef&lt;[T]&gt; 的类型,对吧?等等。 那些的任何集合也实现了它。所以我想:

impl<T> From<T> for PtrBufF32
    where T: AsRef<[dyn Into<PtrBufF32>]>
{
    fn from(f32arr: T) -> Self {
        todo!()
    }
}

但不……显然那些是“冲突的实现”?

error[E0119]: conflicting implementations of trait `std::convert::From<memory::ptrbuf::PtrBufF32>` for type `memory::ptrbuf::PtrBufF32`

然而,如果我尝试 PtrBufF32::from(vec![T])T 实现 Into&lt;AsRef&lt;[f32]&gt;&gt;,它不会让我。很明显,这并不矛盾,是吗?

谢谢

【问题讨论】:

  • dyn Into 未调整大小,不能出现在切片中。你可能想要U: Into&lt;PtrBuf32&gt;
  • 但是U 不受约束

标签: rust


【解决方案1】:

只要您为未定义的类型列表实现了转换,您就应该考虑得更广泛一些。 想象一下某种类型ForeignType,它同时实现了Into&lt;PtrBufF32&gt;AsRef&lt;[f32]&gt;。那么如果你调用PtrBufF32::from(my_foreign_type),编译器就无法决定他必须使用两个实现中的哪一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多