我有一个范围,如果满足条件,我想反转。自 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/