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
每月下载量 114
285KB
7.5K SLoC
Deltoid
概述
Deltoid 是一个类型驱动的Rust库,可以用于计算 delta。两个相同类型的值 a
和 b
之间可以计算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);
}
局限性
该库存在一些局限性
-
不支持联合。目前仅支持
struct
和enum
。 -
derive宏尝试适应泛型类型,但对于使用高级泛型的类型,通常建议使用手动实现而不是
deltoid-derive
,因为它允许更精细的控制。 -
具有具有借用类型的字段(即
&T
和&mut T
对于某些类型T
)的类型目前不支持。这种限制 可能 在未来解除对可变借用,但对于不可变借用来说这是根本性的。 -
在开发过程中,你可能发现Rust的
stdlib
中缺少某些类型的impl实现。如果出现这种情况,这是因为必须手动添加stdlib
中类型的支持,而这还没有完成。你可以为此提交一个问题,或者更好的是,发送一个PR :)
特别感谢
特别感谢Accept B.V.赞助此项目。
依赖项
~0.4–2.3MB
~47K SLoC