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