【发布时间】:2021-10-30 11:27:18
【问题描述】:
我有一个如下所示的配置结构:
struct Conf {
list: Vec<String>,
}
实现是在内部填充list 成员,但现在我决定将该任务委托给另一个对象。所以我有:
trait ListBuilder {
fn build(&self, list: &mut Vec<String>);
}
struct Conf<T: Sized + ListBuilder> {
list: Vec<String>,
builder: T,
}
impl<T> Conf<T>
where
T: Sized + ListBuilder,
{
fn init(&mut self) {
self.builder.build(&mut self.list);
}
}
impl<T> Conf<T>
where
T: Sized + ListBuilder,
{
pub fn new(lb: T) -> Self {
let mut c = Conf {
list: vec![],
builder: lb,
};
c.init();
c
}
}
这似乎工作正常,但现在我使用Conf的任何地方,我都必须更改它:
fn do_something(c: &Conf) {
// ...
}
变成
fn do_something<T>(c: &Conf<T>)
where
T: ListBuilder,
{
// ...
}
因为我有很多这样的函数,所以这种转换很痛苦,尤其是Conf 类的大多数用法并不关心ListBuilder - 这是一个实现细节。我担心如果我向Conf 添加另一个泛型类型,现在我必须返回并在任何地方添加另一个泛型参数。有什么办法可以避免吗?
我知道我可以为列表构建器使用闭包,但我有一个附加约束,即我的 Conf 结构必须是 Clone,并且实际的构建器实现更复杂,并且有几个函数和一些构建器中的状态,这使得闭包方法变得笨拙。
【问题讨论】:
-
不需要绑定
Sized;这是默认设置。