6个版本 (稳定)

2.0.2 2023年3月19日
2.0.1 2021年7月7日
1.0.0 2021年1月17日
0.1.0 2019年10月31日

#781 in 数据结构

Download history 4/week @ 2024-03-10 30/week @ 2024-03-31 11/week @ 2024-04-21 3/week @ 2024-04-28

每月 78 次下载
3 个crate中使用 (via shtola)

AGPL-3.0-or-later

9KB
72

Ware

不可变和可变中间件链。

Ware 允许你创建在传递过程中修改值的中间件链。你可以将中间件链想象成这样

let initial_value = 1;

fn middleware_1(value: i32) -> i32 {
	value + 1
}

fn middleware_2(value: i32) -> i32 {
	value * 5
}

let result = middleware_2(middleware_1(initial_value));
assert_eq!(result, 10);

可变中间件

默认情况下是中间件,它可以通过 RefCell 自由访问并修改传递的值

use ware::Ware;
use std::ops::{Add, Mul};

let mut middleware_chain: Ware<i32> = Ware::new();

middleware_chain.wrap(Box::new(|mut num| {
	*num = num.add(1);
}));
middleware_chain.wrap(Box::new(|mut num| {
	*num = num.mul(5);
}));

let result = middleware_chain.run(1);
assert_eq!(result, 10);

这些中间件函数必须返回一个 () 单元结构,所以最好的选择是省略返回语句。

记住,在中间件函数中直接重新赋值时,始终要解引用参数,否则你将破坏 RefCell

不可变中间件

如果你想依赖不可变性,将 ware::Ware 替换为 ware::im::Ware

use ware::im::Ware;

let mut middleware_chain: Ware<i32> = Ware::new();

middleware_chain.wrap(Box::new(|num| num + 1));
middleware_chain.wrap(Box::new(|num| num * 5));

let result = middleware_chain.run(1);
assert_eq!(result, 10);

注册为中间件的函数不能直接修改它们的变量,因为它们必须是 Fn 特质的。我建议使用在复制值时高效的不可变数据结构。

一般来说,我建议在处理简单数据或不可变性对你至关重要时使用不可变的 Ware。然而,当你处理更复杂的数据结构,如提供自身修改工具的 HashMap 时,你可能想选择可变的 Ware。你不能两者兼得,要么使用可变的,要么使用不可变的。

文档

文档可在 https://docs.rs/ware 获取。

许可

Ware 使用 AGPL 3.0 许可。

无运行时依赖