仅当特征已实现且在范围内时,才能使用特征中的项 [英] items from traits can only be used if the trait is implemented and in scope
本文介绍了仅当特征已实现且在范围内时,才能使用特征中的项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试从平视设计模式实现观察者模式,它最初是用Java编写的:
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();
}
编译器告诉我
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`
我的错误在哪里?
推荐答案
use std::borrow::BorrowMut;
您引入了特征BorrowMut
,它定义了特征方法BorrowMut::borrow_mut
,隐藏固有方法RefCell::borrow_mut
。您可以看出这一点,因为您的类型不是您期望的类型:
最简单的解决方法是删除该导入。您也可以disambiguate between them。 然后,在尝试获取借用值和大量非惯用名称的所有权时,您会遇到更多问题,这会产生大量警告。你应该解决所有这些问题。对于类型
&mut std::rc::Rc<std::cell::RefCell<Observer + 'static>>
这篇关于仅当特征已实现且在范围内时,才能使用特征中的项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文