1个稳定版本

1.0.0 2021年2月18日

2294 in 数据结构

MIT许可证

15KB
231

Rust中的Python风格集合推导式

其结构与Python的列表和字典推导式一致。

  • 如果循环体(第一个for之前的所有内容)包含两个用冒号分隔的表达式,它将被视为哈希表推导式。

  • 如果循环体以分号结束,它将是一个语句推导式(它不会评估为集合)。

  • 否则它是一个向量推导式。

推导式由一个体后跟一个for ... in ...表达式组成,后跟任何组合的for ... in ...if ...表达式。

表达式for ... in ...if ...嵌套顺序从左到右,因此

c!(do_something(x, y); for x in 0..10 if x % 2 == 1 for y in 'a'..='z');

相当于

for x in 0..10 {
    if x % 2 == 1 {
        for y in 'a'..='z' {
            do_something(x, y);
        }
    }
}

示例

向量

  • 简单的向量推导式
let v = c![x * (1 + x) for x in 1..=10];
println!("{:?}", v);
[2, 6, 12, 20, 30, 42, 56, 72, 90, 110]
  • 多个迭代器和条件
let v = c![x * y for x in 1..=10 if x % 2 != 0 for y in -2..=2 if x > y];
println!("{:?}", v);
[-2, -1, 0, -6, -3, 0, 3, 6, -10, -5, 0, 5, 10, -14, -7, 0, 7, 14, -18, -9, 0, 9, 18]

哈希表

  • 简单的哈希表推导式
let m = c!{x: x * (1 + x) for x in 1..=10};
println!("{:?}", m);
{2: 6, 5: 30, 8: 72, 4: 20, 3: 12, 6: 42, 1: 2, 7: 56, 9: 90, 10: 110}
  • 复杂的哈希表推导式
let m = c!{format!("[{}|{}]", x, y): y.to_string().repeat(x) for x in 1..=3 for y in 'A'..='C'};
println!("{:?}", m);
{"[3|C]": "CCC", "[3|B]": "BBB", "[3|A]": "AAA", "[2|B]": "BB", "[1|C]": "C", "[1|A]": "A", "[1|B]": "B", "[2|C]": "CC", "[2|A]": "AA"}

语句

  • 简单的语句推导式
let mut n = 1;
c!(n *= x; for x in 1..=10);
println!("{}", n);
3628800

依赖关系

~1.5MB
~36K SLoC