#tuple #tool #utils

map_tuple

映射元组的各个元素

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 日

#1433Rust 模式

MIT/Apache

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,并在新版本中添加更大的元组(这不会被视为重大更改)。

依赖项