Why am I getting ref to wrong type?

Hi all. I feel like I'm missing something obvious here. I have two structs which depend on each other:

struct A {
    b: Rc<RefCell<B>>,
struct B {
    a: Weak<RefCell<A>>,

and a new function to construct them:

impl A {
    pub fn new() -> Rc<RefCell<A>> {
        let b = Rc::new(RefCell::new(B::new()));
        let a = Rc::new(RefCell::new(A {b: b.clone()}));

        // in B, fn set_a(&mut self, a: Weak<A>)


In the line where I call Rc::downgrade, the compiler complains that it's expected a reference to an Rc, but it's getting a reference to the contained RefCell. Why am I not getting a reference to the Rc itself?

Hi, that's not the error I got:

expected type `&std::rc::Rc<A>`
   found type `&std::rc::Rc<std::cell::RefCell<A>>`

I think you forgot the RefCell in set_a:

fn set_a(&mut self, a: Weak<RefCell<A>>)

If you are going to borrow a value, don't also clone it.


Second, your signature for set_a is wrong, it should be

fn set_a(&mut self, a: Weak<RefCell<A>>)

Yes, that was the problem, the signature on the set call was wrong. Thanks!!

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.