gpt4 book ai didi

rust - 这段代码是否遵循观察者模式?

转载 作者:行者123 更新时间:2023-11-29 07:51:02 24 4
gpt4 key购买 nike

我试图将观察者模式应用于 Rust。与其他 GC 语言(如 JS 或 Java)一样,我想在事件中将对 Observable 中数据的引用发送到 Observer。但是由于借用检查器,编译器一直让我头疼。因此,因此我学会了使用 Rc 但它不允许我改变 Observable 中的值然后我使用了 RefCell 来实现内部可变性按我的意愿工作。万岁我说。但后来我意识到 Rc 导致从不同的地方引用单个位置,这使得 Observer 上的事件系统过时了。所以从 Observer 中删除事件方法后,我得到:

struct Observable<T: Clone> {
value: Rc<RefCell<T>>
}

impl<T: Clone> Observable<T> {
fn new(value: T) -> Observable<T> {
Observable {
value: Rc::new(RefCell::new(value))
}
}

fn set_value(&mut self, value: T) {
*self.value.borrow_mut() = value;
}

fn register(&mut self) -> Observer<T> {
Observer::new(self.value.clone())
}
}

struct Observer<T: Clone> {
value: Rc<RefCell<T>>
}

impl<T: Clone> Observer<T> {
fn new(value: Rc<RefCell<T>>) -> Observer<T> {
Observer {
value
}
}

fn value(&self) -> T {
(*self.value.borrow()).clone()
}
}

Link to Rust Playground

那么从技术角度来看,上面给出的代码是否代表了观察者模式?因为否则它对我有用。但只是想知道什么是观察者模式?

最佳答案

So does the above given code represent an Observer Pattern from a technical point of view?

没有

But just wanted to know what constitutes an Observer Pattern?

我已经更新了你的代码来模拟观察者模式。

#[allow(unused_variables)]
pub trait Events {
fn on_value(&self, value: &str) {}
}
struct Observable {
value: String,
observers: Vec<Box<Events>>,
}

impl Observable {
fn new(value: &str) -> Observable {
Observable {
value: value.to_owned(),
observers: Vec::new(),
}
}

fn set_value(&mut self, value: &str) {
self.value = value.to_owned();
// send event to observers
for observer in &self.observers {
observer.on_value(value);
}
}

fn register<E: Events + 'static>(&mut self, observer: E) {
self.observers.push(Box::new(observer));
}
}

struct Observer;

impl Events for Observer {
fn on_value(&self, value: &str) {
println!("received value: {:?}", value);
}
}

fn main() {
let mut observable = Observable::new("initial value");
observable.register(Observer);
observable.set_value("updated value");
}

Observable 是主题,它维护着一个观察者列表。设置新值时,Observable 会通知观察者。

Link to playground

Blog post about the Observer Pattern in Rust

关于rust - 这段代码是否遵循观察者模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49227046/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com