#iterator #impl #enums #either

iter-n

一个用于返回 impl Iterator 的函数返回多种不同类型的实用工具

1 个不稳定版本

0.1.0 2024 年 4 月 30 日

#863 in Rust 模式


用于 sigmut

MIT/Apache

295KB
7.5K SLoC

iter-n

Crates.io Docs.rs Actions Status

一个用于返回 impl Iterator 的函数返回多种不同类型的实用工具。

动机

在返回 impl Iterator 的函数中,需要返回特定类型的迭代器。因此,无法返回不同类型的迭代器,如下所示。

fn f(x: i32) -> impl Iterator<Item = i32> {
    if x % 2 == 0 {
        [0, 1].iter().map(|y| y + 1)
    } else {
        [0, 1].iter().map(|y| y + 2) // ERROR: `if` and `else` have incompatible types
    }
}

通过使用 iter_n,您可以从函数中返回不同类型的迭代器。

示例

use iter_n::iter2::* 必须放置在函数作用域中,而不是模块作用域中。

由于 iter_n::iter2iter_n::iter3 等,定义了相同名称的方法,如果模块作用域中放置了多个 use iter_n::iter{N}::*;,将会有方法冲突。

fn f(x: i32) -> impl Iterator<Item = i32> {
    use iter_n::iter2::*;
    if x % 2 == 0 {
        [0, 1].iter().map(|y| y + 1).into_iter0()
    } else {
        [0, 1].iter().map(|y| y + 2).into_iter1()
    }
}
fn g(x: i32) -> impl Iterator<Item = i32> {
    use iter_n::iter3::*;
    if x % 3 == 0 {
        [0, 1].iter().map(|y| y + 1).into_iter0()
    } else if x % 3 == 0 {
        [0, 1].iter().map(|y| y + 2).into_iter1()
    } else {
        [0, 1].iter().map(|y| y + 3).into_iter2()
    }
}

许可证

该项目采用 Apache-2.0/MIT 双重许可。请参阅两个 LICENSE-* 文件以获取详细信息。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,将被双重许可,如上所述,无需任何附加条款或条件。

无运行时依赖项