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日 |
#478 在 #map
每月48 次下载
在 funcmap 中使用
100KB
2K SLoC
funcmap - Rust的可导函数映射
这个Rust包提供了FuncMap
特质(及其失败版本TryFuncMap
),它可以自动为泛型类型参数的类型推导。它提供了一个方法,可以将给定闭包应用于类型中所有(可能嵌套的)类型参数的实例,从而无需编写冗长的映射代码。
具体来说,给定一个泛型类型Foo<T>
和一个FnMut(A) -> B
闭包,它可以将任何类型为Foo<A>
的值转换为类型为Foo<B>
的值。这被称为遵循函数式编程的函子设计模式的函子映射。
安装
此包可在crates.io上使用。为了使用它,请将以下内容添加到您的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
。你可以通过从该包中派生 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
包的目的是仅仅提供实用功能,因此
- 你不应该在公共 API 中依赖于它导出的任何项,
- 除了在那些相同特质的泛型实现中,通常不需要在这些导出的特质上使用界限。
有关更详细的说明和更多功能,请参阅 crate 文档。
有关更大的示例,请参阅 示例文件夹。
最低支持的 Rust 版本 (MSRV) 政策
此包当前的 MSRV 为 1.64
。
提高此包的 MSRV 不会被视为破坏性变更。然而,在这种情况下,至少会有一个次要版本的增加。此包的每个版本都将至少支持发布时四个最新的稳定 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
~32K SLoC