【发布时间】: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)
}
}
我得到了另一个堆栈溢出用户的帮助来了解发生了什么——据我所知,这意味着“对于任何可以转换为 &[f32] 的引用的 T(即slice),那么我们就可以实现这个 trait。结果当然只是指向 slice 开头的指针。
但是除了实现可以表示为&[f32] 的任何事物之外,我们还需要实现任何可以用&[f32] 表示的事物的集合。比如,如果我的类型T 实现Into<&[f32]>,那么我可以实现任何AsRef<[T]> 的类型,对吧?等等。 那些的任何集合也实现了它。所以我想:
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<AsRef<[f32]>>,它不会让我。很明显,这并不矛盾,是吗?
谢谢
【问题讨论】:
-
dyn Into未调整大小,不能出现在切片中。你可能想要U: Into<PtrBuf32> -
但是
U不受约束
标签: rust