有什么方法可以将方法中的self用作Rc <refcell <t>&gt;?</refcell <t>

时间:2015-01-08 21:14:21

标签: rust

我有一个具有Rc<RefCell<Bar>>字段的结构(Foo),Bar有一个被Rc<RefCell<Bar>>调用的方法,在该方法中它获得了对Foo的引用,我想将那个Foo中的Rc<RefCell<Bar>>设置为调用该方法的Bar。

请考虑以下代码:

struct Foo {
    thing: Rc<RefCell<Bar>>,
}

struct Bar;

impl Foo {
    pub fn set_thing(&mut self, thing: Rc<RefCell<Bar>>) {
       self.thing = thing;
    }
}

impl Bar {
    pub fn something(&mut self) {
        // Things happen, I get a &mut to a Foo, and here I would like to use this Bar reference
        // as the argument needed in Foo::set_thing            
    }
}

// Somewhere else
// Bar::something is called from something like this:
let my_bar : Rc<RefCell<Bar>> = Rc::new(RefCell::new(Bar{}));
my_bar.borrow_mut().something();
// ^--- I'd like my_bar.clone() to be "thing" in the foo I get at Bar::something

唯一的方法是将我想要的另一个参数添加到Bar::something接受Rc<RefCell<Bar>>吗?当我已经从一个人那里打电话时,感觉很简单。

    pub fn something(&mut self, rcSelf: Rc<RefCell<Bar>>) {
        foo.set_thing(rcSelf);

1 个答案:

答案 0 :(得分:4)

这里有两个主要选择:

  • 使用静态方法:

    impl Bar {
        pub fn something(self_: Rc<RefCell<Bar>>) {
            …
        }
    }
    
    Bar::something(my_bar)
    
  • 隐瞒您正在使用Rc<RefCell<X>>这一事实,将其包装在一个包含单个字段Rc<RefCell<X>>的新类型中;然后其他类型可以使用此新类型而不是Rc<RefCell<Bar>>,您可以使此something方法与self一起使用。根据您的使用方式,这可能是也可能不是一个好主意。没有进一步的细节,很难说。