1
如何正确使用预计在循环中使用method chaining的构建器模式?使用来自log4rs的示例。注意self
不是appender
中的参考。如何在循环中使用链式生成器模式而不会产生编译器错误?
//builder pattern from log4rs
pub struct ConfigBuilder {
appenders: Vec<Appender>,
loggers: Vec<Logger>,
}
impl ConfigBuilder {
pub fn appender(mut self, appender: Appender) -> ConfigBuilder {
self.appenders.push(appender);
self
}
}
做一个错误下面这样的结果,因为(我认为)cb
是越来越移动到.appender()
返回的内存。
let cb = ConfigBuilder::new();
for x in ys {
cb.appender(x);
}
下面这似乎工作。这是唯一的方法吗?
let mut cb = ConfigBuilder::new();
for x in ys {
cb = cb.appender(x);
}
你已经让'appender'获得了所有权并返回新的构建器,所以你需要将返回值放在某个地方。你故意选择这种设计吗?如果你想让第一个例子的循环工作,你需要传递一个可变的自引用。 – loganfsmyth
@loganfsmyth - 对不起,如果我不清楚,那个例子来自log4rs包。 https://crates.io/crates/log4rs。不是我的设计。 – marathon
另请参阅https://stackoverflow.com/q/34362094/155423 – Shepmaster