#observer #watch #data #value #pattern #change #paint

no-std drying_paint

Rust 的观察者模式实现

14 个版本

0.5.5 2024年1月21日
0.5.3 2023年9月13日
0.5.2 2022年7月16日
0.5.0 2021年11月6日
0.1.0 2019年11月30日

#4#observer

Download history 104/week @ 2024-04-02 61/week @ 2024-07-02

61 每月下载次数
用于 suzy

Apache-2.0 OR MIT OR Zlib

84KB
2K SLoC

crates.io docs.rs Build Status License

“drying_paint”这个名字来源于“watching paint dry”的表达。此模块提供了一种“观察”某些值变化并运行代码的系统。

典型用法如下:你首先定义一个结构来保存数据,包括一些“观察”数据。

struct HelloData {
    name: Watched<String>,
    greeting: String,
}

为该结构实现 trait WatcherInit 给你一个地方来设置当观察值变化时应该运行的代码。

impl WatcherInit for HelloData {
    fn init(watcher: &mut WatcherMeta<Self>) {
        watcher.watch(|root| {
            root.greeting = format!("Hello, {}!", root.name);
        });
    }
}

通常你需要将数据结构包装在 Watcher 中,因此通常将观察者类型别名以简化语法

type Hello = Watcher<HelloData>;

创建观察者和设置观察数据需要在 WatchContext 中进行。WatchContext::update_current() 将导致所有挂起的观察者代码运行。

fn main() {
    let mut ctx = WatchContext::new();
    ctx.with(|| {
        let mut obj = Hello::new();
        *obj.data_mut().name = "Rust".to_string();
        WatchContext::update_current();
        assert_eq!(obj.data().greeting, "Hello, Rust!");
    });
}

无运行时依赖