#comprehension #python #vector #macro

list_comprehension_macro

用于创建类似Python的Vector和HashMap列表理解的宏

2次发布

0.1.1 2022年10月20日
0.1.0 2022年10月18日

1821算法

Download history 33/week @ 2024-04-02 4/week @ 2024-05-21 1/week @ 2024-06-11 1/week @ 2024-06-18

每月 61 次下载

MIT 许可证

10KB
138

Python理解宏

Rust中类似Python列表\字典理解的宏。

Python

even_squares = [x**2 for x in arr if x % 2 == 0]
flatten_matrix = [x for row in arr for x in row]
dict_comp = {x: len(x) for x in arr}

Rust等价物

let even_squares = comp![x.pow(2) for x in arr if x % 2 == 0]
let flatten_matrix = comp![x for row in arr for x in row]
let dict_comp = comp!{x: x.len() for x in arr}

示例

use list_comprehension_macro::comp;

fn main() {
    let arr: Vec<u32> = (0..10).collect();
    let new_arr = comp![x.pow(2) for x in arr if x % 2 == 0];
    println!("{:?}", new_arr); // [0, 4, 16, 36, 64]
}
use list_comprehension_macro::comp;

fn main() {
    let arr: Vec<Vec<u32>> = vec![vec![1, 2], vec![3, 4]];
    let new_arr = comp![x for row in arr for x in row];
    println!("{:?}", new_arr); // [1, 2, 3, 4]
}

允许多重嵌套

use list_comprehension_macro::comp;

fn main() {
    let arr: Vec<Vec<u32>> = vec![vec![1, 2], vec![3, 4, 5], vec![6]];
    let new_arr = comp![comp![x + 10 for x in row] for row in arr if row.len() > 1];
    println!("{:?}", new_arr); // [[11, 12], [13, 14, 15]]
}

HashMap理解(使用花括号提高可读性)

use list_comprehension_macro::comp;

fn main() {
    let arr: Vec<&str> = vec!["hello", "World!"];
    let new_arr = comp!{x: x.to_uppercase() for x in arr};
    println!("{:?}", new_arr); // {"hello": "HELLO", "World!": "WORLD!"}
}

允许使用while循环

use list_comprehension_macro::comp;

fn main() {
    let mut i = 0;
    let new_arr = comp![{ i += 1; i } while i < 5];
    println!("{:?}", new_arr); // [1, 2, 3, 4, 5]
}

迭代器

不一次性计算整个理解,可能需要获取一个懒迭代器。为此,请使用i_comp!代替comp!。但是有一些限制

  • 只允许一个循环(并且只允许一个for循环)
  • 必须传递一个迭代器给它

示例

use list_comprehension_macro::i_comp;

fn main() {
    let arr: Vec<u32> = vec![1, 2, 3, 4];
    let mut iter = i_comp![x * 2 for x in arr.iter() if *x != 3];
    println!("{}", iter.next().unwrap()); // 2
    println!("{}", iter.next().unwrap()); // 4
    println!("{}", iter.next().unwrap()); // 8
}

注意

这样的理解

comp![x for x in arr]

会移动arr,这意味着你无法在理解之后使用它。为了防止移动值,你可以传递一个指针

comp![*x for x in &arr]

没有运行时依赖