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