5 个版本
0.1.4 | 2023 年 6 月 25 日 |
---|---|
0.1.3 | 2023 年 3 月 21 日 |
0.1.2 | 2022 年 8 月 13 日 |
0.1.1 | 2022 年 4 月 24 日 |
0.1.0 | 2022 年 4 月 8 日 |
#423 in Rust 模式
每月 21 下载
105KB
1.5K SLoC
funcmap - Rust 的可导函数映射
这个 Rust 包提供了可以自动派生的 FuncMap
特性(及其可错误版本 TryFuncMap
),它可以应用于泛型类型参数的类型。它提供了一个方法,将给定的闭包应用于类型中所有(可能嵌套的)类型参数出现,从而无需编写冗长的映射代码。
具体来说,给定一个泛型类型 Foo<T>
和一个 FnMut(A) -> B
闭包,它可以转换任何类型为 Foo<A>
的值,成为类型为 Foo<B>
的值。这称为遵循函数式编程中的 functor 设计模式的 函数映射。
安装
此包可在 crates.io 上找到。要使用它,请将以下内容添加到您的 Cargo.toml
中的 dependencies
表格中
[dependencies]
funcmap = "0.1.4"
用法
假设您有一个泛型类型参数 T
的类型,并且它包含多个 T
struct Foo<T> {
value: T,
more_values: Vec<T>,
}
现在假设你想将一个 Foo<i32>
转换为 Foo<String>
,通过将类型中包含的每个 i32
转换为 String
,使用 to_string
。你可以通过从这个crate中派生 FuncMap
trait 并调用其 func_map
方法来实现
#[derive(FuncMap)]
struct Foo<T> {
value: T,
more_values: Vec<T>,
}
let foo = Foo {
value: 1,
more_values: vec![2, 3, 4],
};
let bar = foo.func_map(|v| v.to_string());
assert_eq!(bar.value, "1");
assert_eq!(bar.more_values, vec!["2", "3", "4"]);
表达式 foo.func_map(|v| v.to_string())
等同于以下
Foo {
value: foo.value.to_string(),
more_values: foo.more_values.into_iter().map(|v| v.to_string()).collect()
}
这样,你避免了编写样板映射代码,尤其是在你的类型包含许多和/或深层嵌套的 T
的情况下。这对于结构体和枚举以及许多在类型中嵌套 T
的方式(如数组、元组和标准库中的许多类型以及你自己的类型)都有效,只要它们自己实现了 FuncMap
。请注意,funcmap
crate 的目的是仅提供实用功能,因此
- 你不应该在你的公共API中依赖于它导出的任何项目,
- 除了在相同特质的泛型实现中之外,通常不需要在该特质的导出中使用界限。
有关更详细的说明和更多功能,请参阅 crate 文档。
有关更大的示例,请参阅 示例文件夹。
最小支持的Rust版本(MSRV)策略
此crate当前的MSRV为 1.64
。
增加此crate的MSRV不被视为破坏性更改。但是,在这种情况下,至少会有一个次要版本升级。此crate的每个版本将至少支持发布时最新的四个稳定版本的Rust。
变更日志
请参阅 CHANGELOG.md
许可证
根据你的选择,许可协议为以下之一
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
可选。
贡献
除非你明确说明,否则任何有意提交给工作以供包含在你提交的任何贡献中,根据Apache-2.0许可证定义,应如上所述双重许可,而不附加任何其他条款或条件。
依赖项
~1–1.6MB
~31K SLoC