2016-06-02 3 views
-1

Например, мы можем взять this code:Как инициализировать значение другим значением в списке инициализаторов в 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() { 

} 

Вот Чтоб написать A структуры называется a, который я хочу, чтобы инициализировать другое значение в этом же списке инициализатора. Я думаю, что это не представляется возможным, поэтому я обычно использую Option<T>, чтобы сделать это:

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

} 

Но по-моему, это глупо, потому что я бесполезный дополнительную работу здесь, а потом мне нужно всегда разворачивать эту опцию. Есть ли способ сделать это более простым?

ответ

2

Как насчет создания значения в первую очередь?

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

Ха-ха, ты сделал свой день. Не знаю, почему я этого не делал раньше. –

Смежные вопросы