无法编译Rust构建器模式,因为借用的值不够长

时间:2016-09-15 13:31:42

标签: rust builder

我正在尝试使用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。

1 个答案:

答案 0 :(得分:2)

您似乎错过了返回所拥有对象的终结方法,例如:

pub fn finalize(&self) -> DynamicParams {
    DynamicParams { port: self.port }
}

如果有,您可以执行以下操作:

let params = DynamicParams::new().port(1).finalize();

哪个有效,因为右手表达式不返回引用,而是返回拥有的对象。 port()只返回一个可变引用; new()创建的对象必须由早期的let绑定引入,以使对它的引用有效。