#声明性宏 #语法 # #dotnet

chain_linq

.NET LINQ 在 Rust 中的实现,作为一个声明性宏

1 个不稳定版本

0.1.3 2021 年 11 月 20 日
0.1.2 2021 年 11 月 15 日
0.1.1 2021 年 11 月 14 日
0.1.0 2021 年 11 月 14 日

#2684 in Rust 模式

MIT 许可证

14KB
257

Chain-LINQ

该包实现了 .NET 的 LINQ 查询语法,在 Rust 中使用声明性宏。声明性宏由另一个声明性宏生成,即我的另一个包 big_mac 中的 branching_parser。

可用的语句与标准 LINQ 操作紧密对应;特别是缺少 join,因为我无法找到来自迭代器的等效功能。

通常,每个语句都映射到一个迭代器方法;以下是一个列表,包括描述和如果有则等效方法

  • from # in #: 从集合中选择并命名变量。映射到 into_iter()。
  • select #: 结束 LINQ 查询并返回一个迭代器。映射到 map()。
  • select # into #: 部分结束 LINQ 查询并将迭代器放入范围变量中。创建一个后续操作。
  • where #: 仅选择符合特定标准的元素。映射到 filter()。
  • let # = #: 创建一个范围元素。不映射到方法。
  • collect #: 调用 .collect()。
  • collect # as #: 调用 .collect 并带有泛型类型。遵循 select 语法,但 as 参数是目标类型。

需要 ITERTOOLS

  • orderby #: 按标准排序迭代器。映射到 unstable_sort_by_key()。
  • 按 # 升序排序:按标准对迭代器进行排序。映射到 unstable_sort_by_key()。
  • 按 # 降序排序:按标准对迭代器进行降序排序。映射到 unstable_sort_by_key().rev()。
  • 按 # 分组:根据某些标准将元素分组到组中并返回结果。映射到 group_by()。
  • 按 # 分组到 #:根据某些标准将元素分组到组中,然后创建一个继续操作。映射到 group_by()。

有关 LINQ 工作的更多解释,请参阅 Microsoft 的文档 此处

还有用处的: 关键字分解

示例

use chain_linq::linq;

let xs = [(3, 1), (2, 2), (1, 3)];

let x = linq!(
    from (x, y) in xs
    let z = x + y
    select z into zs
    from z in zs
    select z * 2
);
use chain_linq::linq;

let xss = [vec!(27, 13, 12), vec!(69), vec!(76, 7, 420)];

let x = linq!(
    from xs in xss
    group xs by xs.len() into gs
    from iter in gs
    from x in iter
    collect x + 1 as Vec<i32>
);
use chain_linq::linq;

let xss = [vec!(27, 13, 12), vec!(69), vec!(76, 7, 420)];

let x = linq!(
    from xs in xss
    from x in xs.into_iter().rev()
    collect x as Vec<i32>
);

依赖项

~445KB