rust 切片不能按`usize`索引?

rryofs0p  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(127)

我试图构造一个trait(ByteArray),它抽象出一个拥有的序列和一个借用的序列。例如,它允许我这样做:

struct Container<T:ByteArray> {
   data: T
}

然后我可以示例化Container<Vec<u8>>(它拥有数据)和Container<&[u8]>(它不拥有数据)。我的方法是这样的:

use std::ops;

pub trait ByteArray : ops::Index<usize,Output=u8> {
    fn len(&self) -> usize;
}

impl ByteArray for Vec<u8> {
    fn len(&self) -> usize { self.len() }
}

impl<'a> ByteArray for &'a [u8] {
    fn len(&self) -> usize { self.len() }
}

从逻辑上讲,这对我来说似乎是合理的。但是,它失败了这个错误:

`&'a [u8]` cannot be indexed by `usize`

所以,我对此感到困惑。我知道我可以为[u8]实现ByteArray,但这不符合我上面的用例。似乎我可以通过引入一个中间trait来解决这个问题,如下所示:

pub struct ArraySlice<'a,T>(&'a [T]);

impl<'a,T> ops::Index<usize> for ArraySlice<'a,T> {
    type Output = T;

    fn index(&self, index: usize) -> &Self::Output {
        &self[index]
    }
}

impl<'a> ByteArray for ArraySlice<'a,u8> {
    fn len(&self) -> usize {
        self.len()
    }
}

但是,这对我来说感觉有点古怪,我假设有一个更好的解决方案。任何想法都值得赞赏!

xu3bshqb

xu3bshqb1#

可以使用Deref

pub trait ByteArray 
where
    Self: ops::Deref,
    <Self as ops::Deref>::Target: ops::Index<usize, Output = u8>,
{
    fn len(&self) -> usize;
}

playground

相关问题