#comprehension #generator #python #vector #macro

nightly mapcomp

标准容器类似的 Python 列表推导式

7 个版本

0.2.2 2020 年 3 月 9 日
0.2.1 2019 年 11 月 7 日
0.1.3 2018 年 9 月 16 日
0.1.2 2018 年 5 月 1 日
0.1.1 2018 年 4 月 16 日

#2301 in Rust 模式

22 每月下载量

MIT/Apache

16KB
220

mapcomp

crates.io Build Status

通过宏实现 Python 样式的列表推导式,适用于以下标准容器

  • Vec
  • HashMap
  • HashSet
  • BTreeMap
  • BTreeSet

还提供了一个用于生成器推导式的宏。

更多信息请参阅此处文档

许可证

Apache 许可证第 2 版和 MIT 许可证的双许可。


lib.rs:

类似于 Python 列表推导式的容器推导式宏。

此 crate 添加了向量、集合、映射和生成器推导式。它旨在补充 maplit,后者为相同的标准容器提供了宏字面量。

let v = vec![3, 2, 6, 9, 5];

let even_squares = vecc![x * x; for x in v.iter(); if x % 2 == 0];

assert_eq!(even_squares, vec![4, 36]);

宏名称与 maplit 的容器字面量宏名称相同,但在末尾有一个 c 表示 comprehension。还有一个额外的宏 iterc!() 用于创建延迟评估的生成器表达式。

列表推导式存在于许多语言和许多风格中。此 crate 使用与 Python 列表推导式相同的语法,因为它易于使用、可读且广受欢迎。如果您理解 Python 的列表推导式,那么您就理解了 mapcomp 的推导式。

Python 语法的一个微小差异是在子句之间有分号,这是 Rust 宏语言的一个限制。另一个不同之处在于,映射推导式使用 => 符号来区分键和值,而不是像 Python 那样使用冒号。

可以无限次地嵌套 for var in 可迭代 子句,每个循环子句之后的条件 if conditional 是可选的。

let grid = vec![vec![-2, 5], vec![3, -7, 6], vec![4, 2]];

let v = vecc![x; for row in grid; if row.len() < 3; for x in row; if x > 0];

assert_eq!(v, vec![5, 4, 2]);

无运行时依赖