扩展 VecDeque 以限制大小

Expanding a VecDeque to limit size

我想实现一个有最大大小限制的 VecDeque。我有两个攻略,但我都做不完

第一种方法:组合继承。

我创建了一个新结构:

pub struct LimVecDeque<T> {                                                                                                    
     deque: VecDeque<T>,                                                 
     limit: usize,                                                       
}

并创建一个新的推送函数:

impl<T> LimVecDeque<T> {
  ...

  pub fn push (&self, elem: T) {
    self.deque.push_back(elem);
    if self.limit < self.deque.len() {
      self.deque.pop_front();
    }
  }

  ...
}

这可行,但是,随着我的程序的成长,我需要向我的 LimVecDeque 结构添加功能。其中大部分是原始 VecDeque 的副本:

pub fn len(&self) -> usize {
  self.deque.len()
}

我有更多问题需要导出 VecDeque::iter()。我在类型和迭代器方面遇到了问题(我还不太擅长迭代器)。 这种方法迫使我将 VecDeque 中的每个函数 clone/export 放入 LimVecDeque 中。辛苦了!

第二种方法:创建新特征并为 VecDeque 实现:

trait Limited {
  type Elem;

  pub fn push_bounded(&self, limit: usize, elem: Elem);
}

然后使用 VecDeque 实现特征。

但我必须在每次插入时传递 limit 值。怎样才能过一次限值?

一般来说,从 std(没有 loosing/hiding 当前的结构)向结构添加功能的简单方法是什么?

BoundedVecDeque 就是这样做的

use ::bounded_vec_deque::BoundedVecDeque;

fn main() {
    let mut a = BoundedVecDeque::new(2);
    a.push_front(2);
    a.push_front(3);
    a.push_front(4);
    println!("{:?}", a); //4, 3
}

正如 edkeveked 的回答所指出的,有一个箱子可用 (BoundedVecDequeue),它实现了您正在尝试实现的确切案例。

如果您查看 BoundedVecDequeue 的实现,您会发现它使用了您描述的第一个模式:在需要修改包装类型行为的地方创建包装方法,并委托方法在不在的地方调用。

正如您所指出的,这可能会产生大量样板文件。为了减少所涉及的工作量,您可能想尝试 delegate crate,它添加了一个为您进行委托的宏:

use delegate::delegate;

impl<T> LimVecDeque<T> {
    delegate! {
        to self.inner {

            pub fn len(&self) -> usize;
            pub fn truncate(&mut self, new_len: usize);
            pub fn as_mut_slices(&mut self) -> (&mut [T], &mut [T]);
            // etc
        }
    }

    // ...

}

警告:我自己还没有实际使用过这个箱子,所以我不能保证它的质量。