2016-06-02 9 views
-1

Zum Beispiel können wir this code:Wie initialisiert man Wert in der Initialisiererliste in Rust durch einen anderen Wert?

use std::rc::Rc; 

struct B; 

struct A { 
    obj: Rc<B>, 
} 
impl A { 
    fn new(obj: Rc<B>) -> A { 
     A { 
      obj: obj, 
     } 
    } 
} 
struct C { 
    b: Rc<B>, 
    a: A, 
} 
impl C { 
    fn new() -> C { 
     C { 
      b: Rc::new(B), 
      a: A::new(b.clone()), 
     } 
    } 
} 

fn main() { 

} 

Hier ist ein A struct Mitglied nehmen genannt a, die ich durch einen anderen Wert in derselben Initialisiererliste initialisieren möchten. Ich denke, es ist nicht möglich, so dass ich in der Regel Option<T> verwenden, um es zu tun:

use std::rc::Rc; 

struct B; 

struct A { 
    obj: Rc<B>, 
} 
impl A { 
    fn new(obj: Rc<B>) -> A { 
     A { 
      obj: obj, 
     } 
    } 
} 
struct C { 
    b: Rc<B>, 
    a: Option<A>, 
} 
impl C { 
    fn new() -> C { 
     let mut c = C { 
      b: Rc::new(B), 
      a: None, 
     }; 
     c.a = Some(A::new(c.b.clone())); 
     c 
    } 
} 

fn main() { 

} 

Aber meiner Meinung nach ist dies dumm, weil ich nutzlos zusätzliche Arbeit hier zu tun und später muss ich immer diese Option auspacken. Gibt es eine Möglichkeit, dies einfacher zu machen?

Antwort

2

Wie wäre es, zuerst den Wert zu erstellen?

impl C { 
    fn new() -> C { 
     let tmp = Rc::new(B); 
     C { 
      b: tmp.clone(), 
      a: A::new(tmp), 
     } 
    } 
} 
+0

Haha, du hast meinen Tag gemacht. Ich weiß nicht, warum ich das nicht früher gemacht habe. –