2016-04-03 3 views
1

Code:Wie Debuggen zu Struktur mit `RefCell <Vec <Weak<Gadget> >>` Feldtyp implementieren?

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); 
} 

bringen Fehler:

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

Anstatt einen nutzlosen Füllstoff Hinzufügen, warum uns nicht sagen, was Sie nicht verstehen? Verstehst du, was Eigentum und Kreditaufnahme sind? Hast du das Rust Book gelesen? Haben Sie die Dokumentation über ['RefCell :: in_inner'] (https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.into_inner) gelesen? –

+0

@MatthieuM. Ja, jetzt sehe ich, ich muss es mir zuerst ausleihen, denn in_inner() zerstöre RefCell – bjornmelgaard

+0

Genau, und du darfst die 'RefCell' nicht zerstören, weil du sie nur ausleihst. By the way, wenn Sie Ihr Problem gelöst haben, möchten Sie vielleicht selbst antworten :) –

Antwort

1

hinzufügen retreiving Gadget ids

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) 
    } 
} 

Ausgang:

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] } } 

Full code there

Verwandte Themen