2016-09-15 31 views
0

我試圖在Rust中使用builder pattern,但是出現編譯錯誤。無法編譯Rust構建器模式,因爲借用的值不夠長

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。

回答

2

你似乎缺少最終化方法返回一個擁有對象,如:

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

當你擁有它,你可以做到以下幾點:

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

其中一期工程,因爲右手錶達式不返回引用,而是返回擁有的對象。 port()只返回一個可變引用;由new()創建的對象必須由較早的let綁定引入,以便引用它以使其有效。

+0

謝謝!我已經改變了我的getter方法來處理擁有的對象,並返回它。未提及。然後我不需要'.finalize()' – Rory

相關問題