/ / ¿Cómo inicializar el valor por otro valor en la lista de inicializadores en Rust? - Inicialización, óxido

¿Cómo inicializar el valor por otro valor en la lista de inicializadores en Rust? - Inicialización, óxido

Por ejemplo, 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() {

}

Aquí hay un A miembro de estructura llamado a que quiero inicializar por otro valor en la misma lista de inicializador. Creo que no es posible así que suelo usarlo. Option<T> para hacerlo:

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

}

Pero en mi opinión, esto es estúpido porque hago un trabajo adicional inútil aquí y más tarde siempre necesito desenvolver esta opción. ¿Hay alguna manera de hacerlo más simple?

Respuestas

2 para la respuesta № 1

¿Qué hay de crear el valor primero?

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