我试图构造一个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()
}
}
但是,这对我来说感觉有点古怪,我假设有一个更好的解决方案。任何想法都值得赞赏!
1条答案
按热度按时间xu3bshqb1#
可以使用
Deref
:playground