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
61 每月下载次数
用于 suzy
84KB
2K SLoC
“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!");
});
}