2017-10-25 8 views
0

に私はもともとJavaで書かれたヘッズアップデザインパターンからObserverパターンを実装しようとした:のアイテムにのみ使用することができ、スコープ

use std::cell::RefCell; 
use std::rc::Rc; 
use std::borrow::BorrowMut; 

trait Subject { 
    fn registerObserver(&mut self, observer: Rc<RefCell<Observer>>); 
    fn removeObserver(&mut self, observer: Rc<RefCell<Observer>>); 
    fn notifyObserver(&self, observer: Rc<RefCell<Observer>>); 
} 

trait Observer { 
    fn update(&mut self, data: f32); 
} 


struct Teacher { 
    observers: Vec<Rc<RefCell<Observer>>>, 
    data: f32, 
} 
impl Teacher { 
    pub fn print(&self) { 
     println!("teacher = {:}", self.data); 
    } 
} 
impl Subject for Teacher { 
    fn registerObserver(&mut self, observer: Rc<RefCell<Observer>>) { 
     self.observers.push(observer); 
    } 
    fn removeObserver(&mut self, observer: Rc<RefCell<Observer>>) { 
     println!("Teacher.removeObserver(...) not implemented yet...") 
    } 
    fn notifyObserver(&self, observer: Rc<RefCell<Observer>>) { 
     for observer in self.observers { 
      let mut loc_obs = observer.borrow_mut(); 
      loc_obs.update(self.data); 
     } 
    } 
} 

struct Student { 
    data: f32, 
} 
impl Student { 
    pub fn print(&self) { 
     println!("student = {:}", self.data); 
    } 
} 
impl Observer for Student { 
    fn update(&mut self, data: f32) { 
     self.data = data; 
    } 
} 



fn main() { 
    let mut teacher = Teacher { 
     observers: Vec::new(), 
     data: 42., 
    }; 
    teacher.print(); 
} 

Playground

コンパイラはどこにエラーがある?

error[E0599]: no method named `update` found for type `&mut std::rc::Rc<std::cell::RefCell<Observer + 'static>>` in the current scope 
    --> src/main.rs:35:21 
    | 
35 |    loc_obs.update(self.data); 
    |      ^^^^^^ 
    | 
    = help: items from traits can only be used if the trait is implemented and in scope 
    = note: the following trait defines an item `update`, perhaps you need to implement it: 
      candidate #1: `Observer` 

私に語りましたか

答えて

1
use std::borrow::BorrowMut; 

あなたは形質法BorrowMut::borrow_mutシャドーイング固有の方法RefCell::borrow_mutを定義するトレイトBorrowMut、中に持ってきました。あなたのタイプではないので、あなたが期待するものにこれを伝えることができます:

タイプ&mut std::rc::Rc<std::cell::RefCell<Observer + 'static>>

ための最も簡単な修正プログラムは、そのインポートを削除することです。 disambiguate between themでもかまいません。

次に、借りた値の所有権と警告のボートロードを作成する多くの非慣用名を取得しようとすることに、さらに問題があります。それらのすべてに対処する必要があります。

+0

ハハ、あなたよりもずっと!私はBorrowMutを自動インポートしました...おそらく悪い考えでした。私はもっ​​と注意する必要があります!私はまた、 'self.observers'のオブザーバを' self.observers'の 'observer for 'に置き換えることで今すぐ動作させるようにしました。再度、感謝します! – shiMusa

関連する問題