rust - 如何在条件下反转 Range?

标签 rust range conditional-statements

我有一个范围,如果满足条件,我想反转。自 for i in 0..9将以与 for i in 9..0 相同的方式迭代简单地换出数字是行不通的。还有 (0..9).stepy_by(-1)不是 .step_by() 的选项只接受 usize .因此,我尝试执行以下操作:

fn create_range(rev: bool) -> Range<usize> {
    if rev {
        0..9
    } else {
        (0..9).rev()
    }
}

不幸的是,自 0..9 起也无法工作返回 Range<usize>但是 (0..9).rev()返回 Rev<Range<usize>>所以类型不匹配。

我最终将我在循环中调用的所有内容都放在一个函数中,但我对此并不满意。

if rev {
    for i in (0..9).rev() {
        do_stuff(i);
    }
} else {
    for i in 0..9 {
        do_stuff(i);
    }
}

问题是:如果满足条件,是否可以简单地反转范围?

最佳答案

itertools有类型 Either可用于返回两个兼容的迭代器之一:

use itertools; // 0.8.2

fn create_range(
    rev: bool,
) -> itertools::Either<impl Iterator<Item = usize>, impl Iterator<Item = usize>> {
    if !rev {
        itertools::Either::Left(0..9)
    } else {
        itertools::Either::Right((0..9).rev())
    }
}

fn main() {
    println!("Not reversed:");
    for a in create_range(false) {
        println!("{}", a);
    }

    println!("Reversed:");
    for a in create_range(true) {
        println!("{}", a);
    }
}

(Permalink to the playground)

关于rust - 如何在条件下反转 Range?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59467882/

相关文章:

rust - `T + T` 没有实现

rust - 如何使用 Rust 编译/检查目录中的所有文件?

rust - 通过数值作为类型标识符的 serde 反序列化 json

python - 步长为浮点型的范围

c++ - 在 C++ 中创建自己的数据范围

c - Pthread 唤醒多个线程的最佳方式

javascript - 如何根据javascript中的条件渲染模板

rust - 如何复制不同类型但具有相同字段的结构类型(不是值)

mysql - PHP值不会超过127

django - Django 模板中的复杂条件?