1 个不稳定版本
0.1.0 | 2020 年 8 月 29 日 |
---|
#326 在 缓存
13KB
157 行
versioned
这个小巧的crate仅提供了类似指针的Versioned<T>
包装器,该包装器计算其包含的T
值被可变访问的次数。
当基于对象缓存某些计算结果时,这可能很有用,这些对象比较或哈希开销很大,例如大型集合。在这种情况下,存储对象版本并在以后检查是否发生变化可能更方便。
use versioned::Versioned;
let mut versioned_value = Versioned::new("Hello".to_string());
assert_eq!(versioned_value.version(), 0, "version is 0 initially");
// This is an immutable dereference, so it won't change the version.
let value_len = versioned_value.len();
assert_eq!(versioned_value.version(), 0, "version is unchanged after immutable access");
// Now we mutate the value twice.
versioned_value.push_str(" ");
versioned_value.push_str("World!");
assert_eq!(*versioned_value, "Hello World!");
assert_eq!(versioned_value.version(), 2, "version got incremented once per mutable access");
Versioned<T>
实现了Deref
,AsRef
及其Mut
对应物。特别是,由于Deref
转换,Versioned<T>
值可以作为&T
和&mut T
参数传递给函数
use versioned::Versioned;
fn look_at(value: &String) {}
fn modify(value: &mut String) {}
let mut versioned_value = Versioned::new("blabla".to_string());
look_at(&versioned_value);
assert_eq!(versioned_value.version(), 0);
modify(&mut versioned_value);
assert_eq!(versioned_value.version(), 1, "version increased due to mutable dereference");
注意上述示例中,由于突变是基于可变解析引用来计数的,因此在调用modify()
时版本增加,尽管最终没有对值本身进行突变。