4 个版本
0.1.3 | 2023 年 11 月 18 日 |
---|---|
0.1.2 | 2023 年 11 月 17 日 |
0.1.1 | 2023 年 11 月 17 日 |
0.1.0 | 2023 年 11 月 17 日 |
#1433 在 Rust 模式
12KB
172 行
Map Tuple
提供 trait 以允许映射元组的特定元素。有关详细信息,请参阅文档。
这与 tuple-map
crate 不同,因为元组的元素不必是相同类型,可以映射到不同的唯一类型。
lib.rs
:
Map Tuple
此 crate 提供了 trait,允许将不同类型的元组元素映射到其他类型,如下所示
use map_tuple::*;
let tuple = (0i32, 1.0f32, 2i32, true, 4i32)
.map3(|val| if val {3i64} else {0})
.map0(|val| val.to_string())
.map1(|val| Some(val))
.map4(|val| val > 3);
assert_eq!(tuple, ("0".to_string(), Some(1.0f32), 2i32, 3i64, true));
功能
因为 Rust 不允许对元组进行泛型推理,所以必须显式为每个元组大小实现每个元组 trait。此 crate 提供 4 级元组大小(包括其下所有大小)
- 8(默认,未启用功能)
- 16(功能 tuple16)
- 32(功能 tuple32)
- 64(功能 tuple64)
- 128(功能 tuple128)
添加额外的元组大小非常简单,因此选择了任意大小。根据我的经验,元组通常不会超过 5-10,因此提供高达 128 应该足以满足大多数,如果不是所有用途。
为了保持我的理智,使用宏来简化此过程并使其更具可扩展性。然而,这确实会增加一些额外的编译时间,因为宏被展开。更糟糕的是,编译 Rust 泛型本身通常需要很长时间,因此添加另一个元组大小会增加编译时间的指数级增长。
例如,在 i5-8400 上,以下是一些特征/元组大小的调试编译时间
- 无功能(8)=> 0.09 秒
- tuple16 => 0.24 秒
- tuple32 => 1.26 秒
- tuple64 => 9.21 秒
- tuple128 => 76 秒
如果您出于某种原因需要大于 128 的元组,我强烈建议您重新考虑,并尝试使用结构体、vec、枚举或这些组合。但是,如果您真的想要,可以创建一个 pull request,并在新版本中添加更大的元组(这不会被视为重大更改)。