2 个版本 (1 个稳定版)
1.0.0 | 2024年7月21日 |
---|---|
0.1.0 | 2022年11月30日 |
#9 in #tracking
405 次每月下载
在 3 个crate中(直接使用2个) 中使用
23KB
268 行代码
版本跟踪
这个简单的crate提供了一个简单的方法来跟踪和比较直接比较过于昂贵的值的更改。这个crate将跟踪值的可变更改,并在每次修改时自动增加版本号。任何比较都将比较内部版本号,而不是需要对复杂的数据结构进行完全比较。
跟踪是通过两个值进行的,第一个是一个V4 uuid::Uuid,第二个是一个usize 计数器。对于每个要跟踪的值,uuid::Uuid 只生成一次¹,然后每次后续的可变引用访问都会增加计数器。这允许独立跟踪多个不同的值,使用 uuid::Uuid 跟踪跨增加的不同值,并使用计数器跟踪值的直接更改。
该crate提供了两种跟踪版本的方法。第一种方法是通过围绕另一个值创建一个指针样式的包装器。这是使用此crate的最简单方法,但有时可能导致不必要的额外版本增加。为了解决这个问题,可以手动创建一个版本跟踪器,并将其作为结构体上的字段添加或单独存储。
¹ 如果 usize 计数器回绕到零,则可以重新生成 uuid::Uuid 值。
安装和用法
[dependencies]
version-track = "0.1.0"
基本示例
任何值都可以用 Versioned<T>
包装,因为 Versioned<T>
实现了 std::ops::Deref、std::ops::DerefMut、std::convert::AsRef 和 std::convert::AsMut,所以包装的值可以用于大多数可以包装值的地方。
use version_track::Versioned;
let mut tracked_value = Versioned::new(String::from("foo"));
let current_version = tracked_value.version();
tracked_value.push_str("bar");
assert_ne!(current_version, tracked_value.version());
assert_eq!(*tracked_value, "foobar");
直接使用示例
有时需要更多的版本控制,或者无法对要跟踪的值进行包装。在这些情况下,可以直接使用[版本]。在这种情况下,开发者需要决定何时发生更改。这可以用于仅跟踪值的一些修改,或者在需要多个可变引用时只递增一次。
use version_track::Version;
let mut value = String::from("foo");
let mut version = Version::new();
let current_version = version;
value.push_str("bar");
version.increment();
assert_ne!(current_version, version);
assert_eq!(value, "foobar");
支持的Rust版本
此项目将支持从1.60.0开始的Rust版本。
放弃对Rust版本的支持将导致主要版本号的增加,遵循语义版本控制。
许可证
版本跟踪是在ISC许可证下发布的。请参阅LICENSE。
依赖关系
~540KB