我正在尝试使用Rust中的builder pattern,但是我收到了编译错误。
pub struct DynamicParams {
port: Option<u16>,
}
impl DynamicParams {
pub fn new() -> Self {
DynamicParams { port: None }
}
pub fn port(&mut self, port: u16) -> &mut Self {
self.port = Some(port);
self
}
}
fn main() {
let params = DynamicParams::new().port(1);
}
它是available on play.rust-lang.org。
错误:
error: borrowed value does not live long enough
--> <anon>:17:18
|>
17 |> let params = DynamicParams::new().port(1);
|> ^^^^^^^^^^^^^^^^^^^^ does not live long enough
note: reference must be valid for the block suffix following statement 0 at 17:46...
--> <anon>:17:47
|>
17 |> let params = DynamicParams::new().port(1);
|> ^
note: ...but borrowed value is only valid for the statement at 17:4
--> <anon>:17:5
|>
17 |> let params = DynamicParams::new().port(1);
|> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
help: consider using a `let` binding to increase its lifetime
--> <anon>:17:5
|>
17 |> let params = DynamicParams::new().port(1);
|> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to previous error
然而,尽管我可以看到,这与builder pattern, as described in the Rust book非常相似。发生了什么事?我做错了什么?
我正在使用Rust 1.11。
答案 0 :(得分:2)
您似乎错过了返回所拥有对象的终结方法,例如:
pub fn finalize(&self) -> DynamicParams {
DynamicParams { port: self.port }
}
如果有,您可以执行以下操作:
let params = DynamicParams::new().port(1).finalize();
哪个有效,因为右手表达式不返回引用,而是返回拥有的对象。 port()
只返回一个可变引用; new()
创建的对象必须由早期的let
绑定引入,以使对它的引用有效。