#track #notify #change #reactive #watch #debugging

data_tracker

跟踪数据变化并通知监听器

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017年1月6日

#58 in #watch

MIT/Apache

16KB
245

data_tracker - 跟踪数据变化并通知监听器 版本 状态 文档

文档

文档可在 此处 查看。

概述

主要的 API 功能是 DataTracker 结构体,它拥有一个值的所有权。

其工作原理是,DataTracker::as_tracked_mut() 返回一个可变的 ModifierModifier 有两个关键属性

  • 它实现了 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 许可证中定义的,应如上所述双许可,不附加任何额外条款或条件。

行为准则

与 data_tracker 互动的任何人,包括但不限于这个 GitHub 存储库,都应遵守我们的 行为准则

无运行时依赖

功能