rust 如何创建一个大小有限的VecDeque?

t98cgbkg  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(130)

我想实现一个有最大大小限制的VecDeque。我有两个策略,但我不能完成任何一个。

**第一种方法:**组合继承。

创建一个新的struct:

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

创建一个新的push函数:

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中的每个函数克隆/导出到LimVecDeque中。很多工作!

**第二种方法:**为VecDeque创建一个新的trait并实现:

trait Limited {
  type Elem;

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

然后再为VecDeque实现trait。
但是我必须在每次插入中传递limit值。如何才能一次性通过极限值?
一般来说,什么是从std向结构体添加功能的简单方法(而不会丢失/隐藏当前功能)?

57hvy0tb

57hvy0tb1#

正如edkeveked的回答所指出的那样,有一个可用的crate(BoundedVecDequeue),它实现了您试图实现的确切情况。
如果你看一下BoundedVecDequeue的实现,你会发现它使用了你描述的第一个模式:在需要修改 Package 类型的封装的地方创建 Package 方法,在不需要修改封装类型的地方委托方法调用。
正如你所指出的,这可能会导致很多样板文件。为了减少所涉及的工作量,您可能想尝试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
        }
    }

    // ...

}

警告:我还没有真正使用过这个板条箱,所以我不能保证它的质量。

jecbmhm3

jecbmhm32#

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
}

相关问题