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 下载

MIT/Apache

105KB
1.5K SLoC

funcmap - Rust 的可导函数映射

GitHub crates.io docs.rs license rustc 1.64+

这个 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-2.0许可证定义,应如上所述双重许可,而不附加任何其他条款或条件。

依赖项

~1–1.6MB
~31K SLoC