我希望创建一个迭代器,它可以从相反顺序的值中生成偶数。
此代码按升序执行此操作
let a = (2..6)
.step_by(2)
.map(|x| x.to_string() + " ")
.collect();
println!("{a}"); // prints 2 4
如果我扭转这个
let a = (2..6).rev()
.step_by(2)
.map(|x| x.to_string() + " ")
.collect();
println!("{a}"); // prints 5 3
从任何最大值获得正确迭代器的方法是什么,例如。会产生正确反转序列的一个
[4, 2]
?
step_by(2)
在迭代器严格交替偶数和奇数的假设下工作,但也以偶数开始。对于以偶数开头的 Range
来说是这样,但对于每个
Range
的反转来说则不然。特别是,
(2..6).rev()
的第一个元素是奇数。要适应可能以奇数开头的反向范围,请使用
skip_while
:
let a = (2..6).rev()
.skip_while(|x| x % 2 == 1)
.step_by(2)
.map(|x| x.to_string() + " ")
.collect();
println!("{a}"); // prints 5 3
(2..6).rev()
以
5
开头,但
(2..6).rev().skips_while(...)
以
4
开头。请注意,
(2..5).rev()
和
(2..5).rev().skips_while(...)
是等效的,因为原始迭代器中的任何内容都不会被跳过。关于效率,与
相比,谓词将应用于最多2个元素,以满足
step_by(2)
所需的前提条件
let a = (2..6).rev()
.filter(|x| x % 2 == 0)
.map(|x| x.to_string() + " ")
.collect();
不能使用有关 (2..6).rev()
结构的任何信息来应用给定谓词少于 O(n) 次。