【发布时间】:2021-06-24 15:49:32
【问题描述】:
我有一个带有VecDeque<T> 字段和get() -> Option<&Vec<T>> 方法的类型:
struct Storage<T> {
buffer: VecDeque<T>
}
impl<T> Storage<T> {
fn get(&self, /* args */ ) -> Option<&Vec<T>> { /* ... */ }
}
根据get() 的输入参数,我想返回一个Option<&Vec<T>>,它实质上是指buffer 内从索引i 到索引j 的切片:
index = 0 ... i ... j ... (n-1)
buffer = [a, b, c, d, e, f, g, h]
|-----|
return &Vec<T>
到目前为止,在我的尝试中,我发现VecDeque::as_slices() 可能会有所帮助(我确保在调用get() 之前缓冲区始终是连续的)并且我还看到有一些方法可以将切片转换为Vec<T>。它的参考部分&Vec<T> 我似乎遇到了麻烦。
附加细节: get() 方法实际上来自于一个 trait 的实现:
trait Storable {
type OutputType;
fn get(&self, /* args */) -> Option<&Self::OutputType>;
}
此 API 遵循 slab 板条箱中的 Slab 类型,事实上,为 Slab 实现 Storable 非常简单。一种可能性是我将OutputType 关联类型从Vec<T> 更改为其他类型。但是,在我的代码的其他地方,我可能会严重依赖此关联类型是Vec<T> 的假设。这可能是代码的味道。无论解决方案是什么,出于性能原因,我都希望尽可能避免复制/克隆。
【问题讨论】:
-
您确定需要
&Vec<T>吗?&Vec<T>几乎没有用处,也许你可以用&[T]代替。为此,您可以设置type OutputType = [T],这将导致Storable::get()返回Option<&[T]>。如果您确保VecDeque是连续的,那应该正是您所需要的。 -
我构建的实现
Storabletrait 的其他类型的输入/输出是Vec<T>。由于这些其他类型存储Vec<T>s 的方式,存储类型可以拥有这些vecs。但是,我在上面创建的使用VecDeque<T>的类型实际上并不存储向量,因此存在问题。虽然我不反对,但我需要看看切换到&[T]类型的影响。 -
听起来你已经把自己画到了一个抽象的角落里。我并不是说作为一种批评,它确实发生在每个从事非平凡编程的人身上。祝你找到一个可行的优雅解决方案!
-
至少客厅的其他部分看起来不错!
标签: rust