如何用`RefCell <vec <weak <gadget>&gt;&gt;`字段类型实现Debug到struct?

时间:2016-04-03 12:41:05

标签: rust

代码:

struct Owner {
    name: String,
    gadgets: RefCell<Vec<Weak<Gadget>>>,
}

//code omitted

impl fmt::Debug for Owner {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Owner {{ name: {}, gadgets: {:?} }}", self.name, self.gadgets.into_inner())
    }
}

fn main() {
    let gadget_owner : Rc<Owner> = Rc::new( Owner { /**/ });
    let gadget1 = gadget_owner.make_gadget(1);
    println!("gadget1 is: {:?}", gadget1);
}

带来错误:

error: cannot move out of borrowed content [E0507]
src/main.rs:25         write!(f, "Owner {{ name: {}, gadgets: {:?} }}", self.name, self.gadgets.into_inner())
                                                                                   ^~~~

full code there

1 个答案:

答案 0 :(得分:1)

添加retreiving小工具ID

impl fmt::Debug for Owner {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        let gadgets = self.gadgets.borrow();
        let ids: Vec<i32> = gadgets.iter()
                                   .map(|ref x| {
                                       x.upgrade()
                                        .unwrap()
                                        .id
                                   })
                                   .collect();
        write!(f, "Owner {{ name: {}, gadgets: {:?} }}", self.name, ids)
    }
}

输出:

gadget1 is: Gadget { id: 1, owner: Owner { name: Gadget Man, gadgets: [1, 2] } }
gadget2 is: Gadget { id: 2, owner: Owner { name: Gadget Man, gadgets: [1, 2] } }

https://n-n662xy6uqbadudjpoghatx4igmurid667k365ni-script.googleusercontent.com

相关问题