2016-06-02 8 views
-1

Par exemple, nous pouvons prendre this code:Comment initialiser la valeur par une autre valeur dans la liste d'initialisation dans Rust?

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() { 

} 

est ici un membre struct A appelé a que je veux initialiser par une autre valeur dans la même liste d'initialisation. Je pense qu'il est impossible, donc je l'habitude d'utiliser Option<T> pour le faire:

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() { 

} 

Mais à mon avis, c'est stupide parce que je fais un travail supplémentaire inutile ici et plus tard, je dois toujours déballer cette option. Y a-t-il un moyen de le faire plus simple?

Répondre

2

Qu'en est-il de la création de la valeur en premier?

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

Haha, vous avez fait ma journée. Je ne sais pas pourquoi je ne l'ai pas fait plus tôt. –