2017-05-23 5 views
1
pub struct Notifier<'a, T> { 
    callbacks: Vec<Box<'a + FnMut(&T)>> 
} 

impl<'a, T> Notifier<'a, T>{ 
    fn add_callback<F: 'a + FnMut(&T)>(&mut self, callback: F) { 
     self.callbacks.push(Box::new(callback)); 
    } 

    fn trigger(&mut self, payload: T) { 
     for callback in &mut self.callbacks { 
      callback(&payload); 
     } 
    } 

} 

struct A { 
    x: i64 
} 

impl A { 

    fn foo(&mut self, x: &i64) { 
     self.x = x + 1; 
    } 

} 


fn test() { 
    let mut bar = A {x: 3}; 
    let mut notifier = Notifier{callbacks: Vec::new()}; 
    notifier.add_callback(|x| bar.foo(x)); 

} 

Playgroundself.callbacksにself immutablyを借りることはできますか:Vec <Box<FnMut>>?

これは、コールバックを使用して実装され、単純なオブザーバーパターンです。できます。

しかし、trigger(&mut self...が私の後のコーディング(How to update self based on reference of value from hashmap from self)に大きな問題を引き起こすという事実。代わりにtrigger(&self ...を作ることはできますか?

私はrustc 1.19.0を毎晩使用しています。

答えて

2

あなたは可変構造体を持たずに、構造体の内部を変更したい場合は、あなたがCellを使用する必要があります。Cell<T>RefCell<T>種類の

値は、共通の&Tすなわち(共有参照を介して突然変異させることができますほとんどのRustタイプは、一意の(&mut T)参照によってのみ突然変異させることができます。 Cell<T>RefCell<T>は、「継承された変異性」を示す典型的なRust型とは対照的に、「内部の変異性」を提供すると言います。 `trigger`は`&self`を使用

Playground

+0

[遊び場(https://play.rust-lang.org/?gist=2ee39c72c43c8cd196b5a65666e1ac89&version=nightly&backtrace=0) – red75prime

関連する問題