2016-04-03 15 views
1

コード:`RefCell <Vec <Weak<Gadget> >>`フィールド型のstructにデバッグを実装する方法は?

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

むしろ無用フィラーを添加するよりも、なぜあなたは理解していない何を教えていませんか?所有権と借り入れが何であるか理解していますか?あなたは錆の本を読んだことがありますか? ['RefCell :: into_inner'](https://doc.rust-lang.org/std/cell/struct.RefCell.html#method.into_inner)に関するドキュメントを読んだことがありますか? –

+0

@MatthieuM。はい、今見ます、into_inner()がRefCellを破棄するので、私は最初にそれを借りなければなりません。 – bjornmelgaard

+0

'RefCell'を破壊することは許されません。ところで、あなたがあなたの問題を解決した場合、自分自身に答えることをお勧めします:) –

答えて

1

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

retreivingガジェットIDを追加出力:

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

関連する問題