#macro-derive #map #derive #data #macro #no-std

无std funcmap_derive

Rust的可导函数映射

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 中使用

MIT/Apache

100KB
2K SLoC

funcmap - Rust的可导函数映射

GitHub crates.io docs.rs license rustc 1.64+

这个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-2.0 许可证定义,任何有意提交以包含在你所做工作的任何贡献,都应按上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~1–1.6MB
~32K SLoC