pub trait Observer{
type DataType;
fn new(action: fn(&mut Self::DataType))->Self;
fn update(&self, data:&mut Self::DataType);
}
pub trait Subject{
type ObserverType: Observer;
fn new()-> Self;
fn add_observer(&mut self,observer:Rc<Self::ObserverType>);
fn remove_observer(&mut self,observer:&Rc<Self::ObserverType>);
fn data(&mut self)-> &<<Self as Subject>::ObserverType as Observer>::DataType;
fn notification(&mut self);
}
pub struct SubjectMgr{
}
impl SubjectMgr {
fn new(){
let mut map = HashMap::new();
map.insert("PlayerList",PlayerListSubject::new());
map.insert("MonsterList",MonsterListSubject::new());
}
}
尝试使用具有关联值的哈希映射作为成员。但是我不能有一个hashmap值类型吗?
文件结构如下:在此处输入图像描述
在大多数Rust集合中,值(和键(必须具有相同类型的。PlayerListSubject
和MonsterListSubject
是不同的类型,因此它们的值不能放在同一个映射中,除非你在trait对象后面键入擦除它们(假设trait是对象安全的,我认为这里不是这样(。
将来,您可能希望提供该问题的最小可复制示例,而不是不完整的不可用代码。这使得潜在的帮助者更容易尝试和理解这个问题,确保没有人在误解上浪费时间,并增加了获得有用答案的几率(我不确定这个答案是不是(。
不过,整个东西看起来都是从Java或C#中提取的,这对它的实际工作来说是个坏兆头。Rust是一种完全不同的语言,它对语言用户有自己的一系列限制。试图在其中复制Java设计通常会导致沮丧,无法使事情正常工作。
use std::{ops::Deref, rc::Rc};
use super::{Observer, Subject};
struct Monster{
id: String,
password: String,
}
#[derive(Default)]
struct MonsterList{
players: Vec<Monster>
}
impl Deref for MonsterList {
type Target = Vec<Monster>;
fn deref(&self) -> &Self::Target {
&self.players
}
}
impl MonsterList {
pub fn new() -> Self {
MonsterList::default()
}
}
pub struct MonsterListObserver{
action: fn(&mut MonsterList),
}
impl Observer for MonsterListObserver{
type DataType = MonsterList;
fn new(action: fn(&mut Self::DataType))->Self {
Self {action}
}
fn update(&self, data:&mut Self::DataType) {
(self.action)(data);
}
}
pub struct MonsterListSubject{
monster_list: MonsterList,
observers: Vec<Rc<MonsterListObserver>>,
}
impl Subject for MonsterListSubject{
type ObserverType = MonsterListObserver;
fn new()-> Self {
Self {
monster_list: MonsterList::new(),
observers: Vec::new(),
}
}
fn add_observer(&mut self,observer:Rc<Self::ObserverType>) {
self.observers.push(observer);
}
fn remove_observer(&mut self,remove_observer:&Rc<Self::ObserverType>) {
self.observers.retain(|observer|{
let observer = &**observer as *const MonsterListObserver;
let remove_observer = &**remove_observer as *const MonsterListObserver;
observer != remove_observer
})
}
fn data(&mut self)-> &<Self::ObserverType as Observer>::DataType {
&mut self.monster_list
}
fn notification(&mut self) {
let monster_list = &mut self.monster_list;
self.observers
.iter()
.for_each(|observer| observer.update(monster_list))
}
}