jam*_*ier 5 collections deque rust
我想实现一个VecDeque
具有最大大小限制的。我有两个策略,但我都无法完成。
第一种方法:组合继承。
我创建了一个新结构:
pub struct LimVecDeque<T> {
deque: VecDeque<T>,
limit: usize,
}
Run Code Online (Sandbox Code Playgroud)
并创建一个新的推送函数:
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();
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,但是随着我的程序的成长,我需要向我的LimVecDeque
结构添加功能。其中大部分是原件的副本VecDeque
:
pub fn len(&self) -> usize {
self.deque.len()
}
Run Code Online (Sandbox Code Playgroud)
我还有更多问题需要导出VecDeque::iter()
。我在类型和迭代器方面遇到了问题(我还不太擅长迭代器)。这种方法迫使我将每个函数克隆/导出VecDeque
到LimVecDeque
. 大量的工作!
第二种方法:创建一个新特征并实施VecDeque
:
trait Limited {
type Elem;
pub fn push_bounded(&self, limit: usize, elem: Elem);
}
Run Code Online (Sandbox Code Playgroud)
然后再实现 的特征VecDeque
。
但我必须limit
在每次插入中传递值。怎样才能一次超过极限值呢?
一般来说,从 std 向结构添加功能(不丢失/隐藏当前功能)的简单方法是什么?
正如 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
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
警告:我自己还没有实际使用过这个板条箱,所以我不能保证它的质量。
归档时间: |
|
查看次数: |
1555 次 |
最近记录: |