2 个不稳定版本
0.2.1 | 2024年6月21日 |
---|---|
0.2.0 |
|
0.1.0 | 2024年6月20日 |
659 在 数据结构 中
每月下载 32 次
27KB
565 行
Zond
Zond 是一个具有收集统计信息的标准 Rust 集合的 crate。
好吧,也许它只包含 [Vec] 的类似物 - zvec::ZVec
。好吧,ZVec
只包含 Vec
的一些方法。但我只是出于好玩才做这个。我不知道有人真的需要这个。
示例
让我们从构建集合开始。
构造函数类似于它们的 std 类似物,但有一个额外的参数 - 结构体 Zond
,包含两个字段
zond_handler
的类型为ZondHandler
。
具有单个方法的特例对象,该方法消耗两个参数:id
作为usize
和operations
作为Operations
。所有操作处理都在这里进行:您可以将其保存到文件或数据库中,发送到您的服务器或直接打印到控制台。policy
的类型为Policy
。
描述了收集操作将在何时由zond_handler
处理的规则。
所以首先让我们实现一些 ZondHandler。它将只是将操作打印到 stdout
struct HandlerImpl;
impl<T: OperationType + Debug> ZondHandler<T> for HandlerImpl {
fn handle(&self, id: usize, operations: Operations<T>) {
println!("{id} collected");
operations
.iter()
.for_each(|v| println!("{:?}: {:?}", v.get_instant(), v.get_type()));
println!();
}
}
接下来,让我们用 HandlerImpl 处理器和这样的策略来构建 Zond,即每次调用三个方法后处理操作。
它将为 ZVec 处理操作
let zond: Zond<ZVecOperation<usize>> = Zond::new(
HandlerImpl,
Policy::on_count_operations(NonZeroUsize::new(3).unwrap()),
);
接下来,让我们用 zond 变量构建 ZVec
let mut zvec: ZVec<usize> = ZVec::new(zond);
最后,让我们执行一些操作
zvec.push(1);
zvec.push(2);
zvec.push(5);
zvec.push(5);
zvec.extend_from_within(1..);
zvec.dedup();
drop(zvec);
控制台输出将如下所示
0 collected
Instant { /* */ }: New
Instant { /* */ }: Push { value: 1 }
Instant { /* */ }: Push { value: 2 }
0 collected
Instant { /* */ }: Push { value: 5 }
Instant { /* */ }: Push { value: 5 }
Instant { /* */ }: ExtendFromWithin { src_start_bound: Included(1), src_end_bound: Unbounded }
0 collected
Instant { /* */ }: Dedup
如您所见,操作总是在丢弃时被处理。