Por exemplo, podemos tomar este código:
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() {
}
Aqui está um A
membro struct chamado a
que eu quero inicializar com outro valor na mesma lista de inicializadores. Eu acho que não é possível, então eu costumo usar Option<T>
para fazer isso:
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() {
}
Mas, na minha opinião, isso é estúpido, porque faço um trabalho extra inútil aqui e, mais tarde, sempre preciso desembrulhar essa opção. Existe alguma maneira de fazer isso mais simples?
Respostas:
2 para resposta № 1Que tal criar o valor primeiro?
impl C {
fn new() -> C {
let tmp = Rc::new(B);
C {
b: tmp.clone(),
a: A::new(tmp),
}
}
}