扩展 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
}
}
// ...
}
警告:我自己还没有实际使用过这个箱子,所以我不能保证它的质量。
我想实现一个有最大大小限制的 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
}
}
// ...
}
警告:我自己还没有实际使用过这个箱子,所以我不能保证它的质量。