【发布时间】:2021-08-02 09:18:40
【问题描述】:
这是一个包含向量的玩具结构
struct SizedVec {
items: Vec<u32>,
cap: usize,
}
我想在 SizedVec 上拥有迭代函数,这样它们就可以像我直接迭代项目一样工作。
但是,我不确定应该实现哪些特征:Iterator 和 IntoIterator 是否足够? the docs有很多特质
而且它们看起来有点复杂和乏味。
然后我看到我可以实现 Deref 和 DerefMut 并使用 deref coercion 免费获得所有这些功能:
果然,这样做之后:
impl Deref for SizedVec {
type Target = Vec<u32>;
fn deref(&self) -> &Self::Target {
&self.items
}
}
impl DerefMut for SizedVec {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.items
}
}
我可以使用所有我想要的迭代器。但是我想实现一个自定义的推送逻辑,但是DeRef已经给了我一个推送。但是根据文档我应该没问题,因为显然查找是按顺序为每种类型完成的
impl SizedVec {
fn from_size(size: usize) -> Self {
Self {
items: vec![],
cap: size,
}
}
fn push(&mut self, item: u32) {
if self.items.len() < self.cap {
self.items.push(item);
}else {
self.items.pop();
self.items.push(item);
}
}
}
这似乎有效,
fn main () {
let mut svec = SizedVec::from_size(2); // Custom function I implemented
svec.push(2);
svec.push(3);
svec.push(4);
svec.iter_mut().for_each(|item| {*item = *item + 2});
println!("{}", svec); // Items: [4, 6], Cap: 2 (Implemented Display so this works)
}
这一切似乎都很好,但我的问题是:这是个好主意吗?如果我将SizedVec 转换为泛型类型,我会遇到问题吗?
如果这是一个坏主意,有没有一种简单的方法可以将内部向量项的所有迭代/映射功能放到封闭的结构上?
另外,是否有任何性能方面的考虑?
【问题讨论】: