我正试图构建一个特征(ByteArray
),它抽象出拥有的序列与borrow 的序列.例如,它将允许我执行以下操作:
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
,但这不符合我上面的用例.似乎我也可以通过引入一个中介特性来解决这个问题,如下所示:
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()
}
}
但是,这对我来说有点老生常谈,我假设有更好的解决方案.如有任何意见,敬请垂询!