#comprehension #python #macro #syntax

set_derive

使用宏在 Rust 中实现类似于 Python 语言的列表推导

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

MIT 许可证

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")]));

无运行时依赖