#delta #structs #calculate #macro #define #apply #deltoid

deltoid-derive

用于生成代码,计算并应用于结构体和枚举中的delta宏

24个版本

0.12.0 2023年7月2日
0.11.1 2021年5月6日
0.11.0 2021年4月29日
0.10.0 2021年3月27日
0.3.0 2020年3月12日

#39 in #apply

Download history 33/week @ 2024-03-10 31/week @ 2024-03-17 28/week @ 2024-03-24 69/week @ 2024-03-31 36/week @ 2024-04-07 29/week @ 2024-04-14 26/week @ 2024-04-21 34/week @ 2024-04-28 18/week @ 2024-05-05 10/week @ 2024-05-12 17/week @ 2024-05-19 29/week @ 2024-05-26 27/week @ 2024-06-02 46/week @ 2024-06-09 33/week @ 2024-06-16 6/week @ 2024-06-23

每月下载量 114

MIT/Apache

285KB
7.5K SLoC

Deltoid

Rust

概述

Deltoid 是一个类型驱动的Rust库,可以用于计算 delta。两个相同类型的值 ab 之间可以计算delta Δ。一旦计算出来,Δ 就可以应用到第一个值 a 上,得到一个新的值 c,这个值与第二个值 b 等价。

计算delta的主要用例是跟踪一系列相关且可能深度嵌套的数据树,同时确保资源消耗(例如RAM、网络带宽)合理。由于这样的序列可能需要导出以进行进一步处理,delta的序列化/反序列化是定义的。这允许您将数据作为一个delta序列收集在同一个地方,导出它(可能通过网络连接),然后在接收端通过依次应用序列中的delta重建原始序列。

使用

在您的 Cargo.toml 中添加以下内容

[dependencies]
deltoid = "0.11.1"
deltoid-derive = "0.11.1"

计算delta,然后应用它

use deltoid::Deltoid;
use serde_derive::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Deltoid)]
struct Point {
    x: usize,
    y: usize,
}

fn main() {
    // Define 2 instances of the same type
    let point0 = Point { x:  0, y: 0 };
    let point1 = Point { x: 42, y: 8 };

    // Calculate the delta between them
    let delta = point0.delta(&point1).unwrap();

    // Apply  the delta to `point0`
    let point2 = point0.apply(delta).unwrap();
    assert_eq!(point1, point2);
}

局限性

该库存在一些局限性

  1. 不支持联合。目前仅支持 structenum

  2. derive宏尝试适应泛型类型,但对于使用高级泛型的类型,通常建议使用手动实现而不是 deltoid-derive,因为它允许更精细的控制。

  3. 具有具有借用类型的字段(即 &T&mut T 对于某些类型 T)的类型目前不支持。这种限制 可能 在未来解除对可变借用,但对于不可变借用来说这是根本性的。

  4. 在开发过程中,你可能发现Rust的stdlib中缺少某些类型的impl实现。如果出现这种情况,这是因为必须手动添加stdlib中类型的支持,而这还没有完成。你可以为此提交一个问题,或者更好的是,发送一个PR :)

特别感谢

特别感谢Accept B.V.赞助此项目。

依赖项

~0.4–2.3MB
~47K SLoC