2015-01-08 11 views
6

Rc<RefCell<Bar>> alanına sahip bir struct (Foo) var, Bar'ın bir Rc<RefCell<Bar>> tarafından çağrılan bir yöntemi vardır, bu yöntemde bir Foo'ya bir başvuru alır ve bu Foo'ya Rc<RefCell<Bar>> değerini ayarlamak istiyorum. Yöntemi denen Bar.Kendimi bir yöntemden Rc <RefCell<T>> olarak kullanabilir miyim?

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 

Bir Rc<RefCell<Bar>> kabul Bar::something için başka bir parametre eklemek istediklerinizi yapmanın tek yolu var mı:

Aşağıdaki kodu düşünün? Zaten onu birinden aradığımda redudant hissediyor.

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

cevap

2

burada iki ana seçenek vardır:

impl Bar { 
    pub fn something(self_: Rc<RefCell<Bar>>) { 
     … 
    } 
} 

Bar::something(my_bar) 
  • yeni tip sararak, sen Rc<RefCell<X>> kullandığınız gerçeğini gizlemek:

    • statik yöntemi kullanın tek alan Rc<RefCell<X>> ile; sonra diğer türleri Rc<RefCell<Bar>> yerine bu yeni türü kullanabilir ve bu something yöntemini self ile çalışabilirsiniz. Bu, onu nasıl kullandığınıza bağlı olarak iyi bir fikir olabilir veya olmayabilir. Daha fazla ayrıntı olmadan söylemek zor.

  • +0

    Teşekkürler, sanırım statik bir yöntemle gidiyorum. İkinci seçeneği doğru olarak anlayabiliyorsam, yeni bir kod yazmak, koduma bakarken hala çok fazla fazlalık hissettiriyor, çünkü tüm verileriyle 'Bar' yapısına ve daha sonra bazı 'BarRef' türüne sahip olursam, ve bir yöntemin nasıl çalıştığına bağlı olarak birini ya da diğerini ima etmek zorundayım. Her halükarda, bunu yapmak için iyi bir fikir olduğunda (ya da değil) biraz daha genişlemeyi düşünür müsün? – GGalizzi

    İlgili konular