#comprehension #map #macro #scala #filter-map #options #flat-map

map_for

一个实现类似于 Scala 的 comprehension 的 Rust 宏

4 个版本 (2 个重大变更)

使用旧的 Rust 2015

0.3.0 2017 年 10 月 20 日
0.2.0 2017 年 7 月 9 日
0.1.1 2017 年 7 月 7 日
0.1.0 2017 年 6 月 26 日

#2198Rust 模式

Download history 12/week @ 2024-02-14 23/week @ 2024-02-21 12/week @ 2024-02-28 2/week @ 2024-03-06 8/week @ 2024-03-13 1/week @ 2024-03-20 6/week @ 2024-03-27 13/week @ 2024-04-03 3/week @ 2024-04-10 45/week @ 2024-04-17 37/week @ 2024-04-24

每月 100 次下载

MIT 许可证

17KB
208

README

Build status Docs

这是一个实现类似于 Scala 的 comprehension 的 Rust 宏。

示例

let l = map_for!{
   x <- 0..10;
   y = x/2;
   if (y%2) == 0;
   z <- 0..1;
   => y+z }

将被扩展为

let l = (0..10).map (move |x| { let y = x / 2; (x, y) })
   .filter (|params| { let (x, y) = *params; (y%2) == 0 })
   .flat_map (move |params| {
      let (x, y) = params;
      (0..1).map (move |z| { y + z }) });

注意,由于 Rust 没有Scala的局部函数的等价物,comprehension 无法执行完整的模式绑定,只能用于单个绑定(即 v <-)或元组绑定(即 (x, y) <-)。

comp 相比,map_for 更为通用:comp 有针对 OptionIteratorResult 的特殊符号和代码,而 map_for 可以与任何具有 mapflat_mapfilter 方法的类型一起工作,或者可以将它们扩展为 map_for.FlatMapmap_for.FilterOption 的处理,而 Option 只有一个 map

mdo 相比,map_for 采用更简单、更直接的方法,因为大多数单子类型已经定义了 mapflat_mapfilter 方法,而 mdo 需要重新实现特定的 API。

无运行时依赖