7 个版本 (2 个稳定版)
1.1.0 | 2024年1月9日 |
---|---|
1.0.0 | 2024年1月9日 |
0.1.4 | 2023年6月19日 |
0.1.3 | 2023年3月26日 |
在 Rust 模式 中排名 453
每月下载量 35
20KB
472 行
使用宏在 Rust 中实现模仿 Python 语言的列表推导
- 您可以使用相对较少的代码初始化常见的集合类型
- 已实现
Vec [v]
,HashMap {k=>v}
和HashSet !{k}
Vec 或 HashSet 语法
- 普通元素:
[foo, 1, 2i32]
- for each:
[*(i; for i in 0..10)]
- for each 和 filter:
[*(i; for i in 0..10; if i != 5)]
- for each、filter 和 sub for each:
[*(i + j; for i in 0..10; if i != 5; for j in 1..i)]
HashMap 语法
- 普通元素:
{k => v, [k1]: v1}
- 字符串普通键:
{%[key]: "jack"}
(key: String
) - 标识键:
{name: "jack"}
(name: &'static str
) - 字符串标识键:
{%name: "jack"}
(name: String
) - 变量键:
{*key: "jack"}
(let key = "name";
) - 字面量键:
{"name": "jack"}
- 字面量键转换为字符串:
{%"name": "jack"}
(name: String
) - for each: 与Vec中的用法类似,但略有不同。例如:
{*(i => i+1; for i in 0..5)}
其他
- for each 保留:
[*[10](i; for i in 0..10)]
- 泛型参数:
<i64>[1, 2, 3]
- 使用容量初始化:
(20)[1, 2, 3]
|<i64>(20)[1, 2, 3]
- 检查区块:
[*(i; for i in 0..10; {dbg!(i);} if i & 1 == 0)]
仓库:https://crates.io/crates/set_derive
示例
# use set_derive::set_derive;
# use std::collections::HashMap;
let arr1 = vec![
0, 1, 8, 9, 10, 15, 16, 17, 18, 19,
];
let arr2 = set_derive!([
0, 1,
*(i; for i in 8..=10),
*(i; for i in 15..20),
]);
// python: [0, 1, *range(8, 10+1), *range(15, 20)]
assert_eq!(arr1, arr2);
let arr = set_derive!([*(
i+j;
for i in 0..6;
if i%2!=0;
for j in 0..i;
)]);
// python: [i+j for i in range(6) if i%2 for j in range(0, i)]
assert_eq!(arr, vec![1, 3, 4, 5, 5, 6, 7, 8, 9]);
let age_key = "age";
let jack = set_derive!({
name: "jack",
*age_key: "20",
});
assert_eq!(jack, HashMap::from([("name", "jack"), ("age", "20")]));