JON: Tak já už nevím.
Zkoušel jsem už všechno co mě napadlo. Ale vždycky jsem se na něčem zasekl. Já prostě nedokážu protlačit ten parent v metodě append.
Tak jak to mám níže mi to nefunguje, protože jako `append(&mut self,` mi to vrací `Root`, místo `Rc[Root]`.
Zkoušel jsem i nevracet Rc[Self] ale přímo Self. Ale tam jsem opět zasekl v append. Divoce jsem to vydereferencoval (`*(&*self)`) až do fáze, že to chtělo Copy trait. Což nechci.
Můžete se mi prosím podívat na následující "ideální" kód, a poradit mi, jak to upravit?
use std::rc::Rc;
use std::fmt::Display;
struct Item {
name: String,
parent: Rc<Root>,
}
impl Item {
pub fn new(parent: &Rc<Root>, name: String) -> Rc<Self> {
Rc::new(Self {
name: name,
parent: parent.clone(),
})
}
}
struct Root {
name: String,
items: Vec<Rc<Item>>,
}
impl Root {
pub fn new(name: String) -> Rc<Self> {
Rc::new(Self {
name: name,
items: vec![],
})
}
pub fn append(&mut self, itemname: String) {
self.items.push(Item::new(&self, itemname));
}
}
impl Display for Root {
fn fmt(&self, w: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
write!(w, "{} [", self.name)?;
for x in self.items.iter() {
write!(w, "{}, ", x.name)?;
}
write!(w, "]")
}
}
fn main() {
let tree = Root::new("Kay".to_string());
tree.append("Alfa".to_string());
tree.append("Beth".to_string());
println!("{}", tree);
}