1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2017年1月6日 |
---|
#58 in #watch
16KB
245 行
data_tracker - 跟踪数据变化并通知监听器
文档
文档可在 此处 查看。
概述
主要的 API 功能是 DataTracker
结构体,它拥有一个值的所有权。
其工作原理是,DataTracker::as_tracked_mut()
返回一个可变的 Modifier
。 Modifier
有两个关键属性
- 它实现了
DerefMut
特性,允许以舒适的方式访问底层数据。 - 它实现了
Drop
特性,用于检查底层数据是否已更改,如果是,则通知监听器。
此外,DataTracker::as_ref()
返回对数据的(不可变)引用,当只需要对数据进行只读访问时使用。
为了实现跟踪,当创建 Modifier
时,会制作原始数据的副本,当 Modifier
被丢弃时,会执行相等性检查。如果原始数据和新的数据不相等,则通过引用调用回调函数,引用旧值和新值。
示例
use data_tracker::DataTracker;
// Create a new type to be tracked. Must implement Clone and PartialEq.
#[derive(Debug, Clone, PartialEq)]
struct MyData {
a: u8,
}
// Create some data.
let data = MyData {a: 1};
// Transfer ownership of data to the tracker.
let mut tracked_data = DataTracker::new(data);
// Register a listener which is called when a data change is noticed.
let key = 0; // Keep the key to remove the callback later.
tracked_data.add_listener(key, Box::new(|old_value, new_value| {
println!("changed {:?} -> {:?}", old_value, new_value);
}));
{
// Create x, a (non-mutable) reference to original data.
let x = tracked_data.as_ref();
println!("x.a: {}",x.a);
}
{
// Create x, which allows modifying the original data and checks for changes when
// it goes out of scope.
let mut x = tracked_data.as_tracked_mut();
x.a = 10;
println!("x.a: {}",x.a);
// When we leave this scope, changes are detected and sent to the listeners.
}
// Remove our callback.
tracked_data.remove_listener(&key);
许可协议
根据以下任意一种许可协议许可
- Apache 许可证 2.0 版,(./LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (./LICENSE-MIT 或 http://opensource.org/licenses/MIT),您自行选择。
贡献
除非您明确声明,否则任何有意提交以包含在您的工作中的贡献,如 Apache-2.0 许可证中定义的,应如上所述双许可,不附加任何额外条款或条件。
行为准则
与 data_tracker 互动的任何人,包括但不限于这个 GitHub 存储库,都应遵守我们的 行为准则