2次发布
0.1.1 | 2022年10月20日 |
---|---|
0.1.0 | 2022年10月18日 |
1821 在 算法 中
每月 61 次下载
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]