2015-01-08 11 views
6

Mam struct (Foo), który ma pole Rc<RefCell<Bar>>, Bar ma metodę, która jest wywoływana przez Rc<RefCell<Bar>>, w tej metodzie dostaje odniesienie do Foo i chciałbym ustawić, że Rc<RefCell<Bar>> w tym Foo do Pasek, który nazwał metodę.Czy istnieje sposób, w jaki mógłbym użyć self z metody jako Rc <RefCell<T>>?

Rozważmy następujący kod:

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 

jest jedynym sposobem, aby robić to, co chcę dodać kolejny parametr do Bar::something akceptując Rc<RefCell<Bar>>? Czuje się odrażający, kiedy już to robię.

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

Odpowiedz

2

Istnieją dwa główne wybory tutaj:

  • użyć metody statycznej:

    impl Bar { 
        pub fn something(self_: Rc<RefCell<Bar>>) { 
         … 
        } 
    } 
    
    Bar::something(my_bar) 
    
  • ukryć fakt, że używasz Rc<RefCell<X>>, owijając go w nowego typu z pojedynczym polem Rc<RefCell<X>>; wtedy inne typy mogą używać tego nowego typu, a nie Rc<RefCell<Bar>>, a Ty możesz uczynić tę metodę something współpracą z self. To może, ale nie musi być dobry pomysł, w zależności od tego, jak go używasz. Bez dalszych szczegółów trudno powiedzieć.

+0

Dzięki, myślę, że pójdę z metodą statyczną. Jeśli poprawnie poznałem drugi wybór, sprawienie, by nowy typ nadal wydawał się zbyt niepotrzebny, gdybym spojrzał na mój kod, ponieważ miałbym strukturę 'Bar' ze wszystkimi jej danymi, a następnie jakiś nowy typ' BarRef', i musiałbym implować jedno lub drugie w zależności od tego, jak działa pewna metoda. W każdym razie, czy mógłbybyś rozszerzyć nieco, kiedy może (lub nie) być dobrym pomysłem, aby to zrobić? – GGalizzi

Powiązane problemy