2016-09-15 7 views
0

Ich versuche, das builder pattern in Rust zu verwenden, jedoch erhalte ich einen Kompilierungsfehler.Kann nicht ein Rust-Builder-Muster kompilieren, weil ein geliehener Wert nicht lange genug lebt

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); 
} 

Es ist available on play.rust-lang.org.

Fehler:

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 

jedoch so nahe wie ich sehe, das ist sehr ähnlich die builder pattern, as described in the Rust book. Was ist los? Was mache ich falsch?

Ich benutze Rust 1.11.

Antwort

2

Sie scheinen eine Finalisierung Methode zu fehlen eine verknüpfte Objekt zurückkehrt, wie:

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

Wenn Sie es haben Sie folgende Möglichkeiten:

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

Welche, weil die rechte Hand funktioniert Der Ausdruck gibt keinen Verweis, sondern ein Objekt im Besitz zurück. port() gibt nur eine änderbare Referenz zurück; das von new() erzeugte Objekt müsste durch eine frühere Bindung eingeführt werden, damit ein Verweis darauf gültig ist.

+0

Danke! Ich habe meine Getter-Methoden geändert, um an eigenen Objekten zu arbeiten und diese zurückzugeben. Keine Referenzen. Dann brauche ich das '.finalize()' nicht – Rory

Verwandte Themen