我在 Rust 中如何迭代一个范围,步长不是 1
?我来自 C++ 背景,希望实现类似下面的功能:
for(auto i = 0; i <= n; i+=2) {
//...
}
在 Rust 中,我需要使用 range
函数,但似乎没有第三个参数可用于设置自定义步长。我该如何实现这一点?range_step_inclusive
和 range_step
已经不再使用。
从 Rust 1.28 开始,Iterator::step_by
是稳定的:
fn main() {
for x in (1..10).step_by(2) {
println!("{}", x);
}
}
在.step_by
方法稳定之前,我认为可以使用Iterator
轻松实现您想要的功能(这也是Range
的本质):
struct SimpleStepRange(isize, isize, isize); // start, end, and step
impl Iterator for SimpleStepRange {
type Item = isize;
#[inline]
fn next(&mut self) -> Option<isize> {
if self.0 < self.1 {
let v = self.0;
self.0 = v + self.2;
Some(v)
} else {
None
}
}
}
fn main() {
for i in SimpleStepRange(0, 10, 2) {
println!("{}", i);
}
}
use std::ops::Add;
struct StepRange<T>(T, T, T)
where for<'a> &'a T: Add<&'a T, Output = T>,
T: PartialOrd,
T: Clone;
impl<T> Iterator for StepRange<T>
where for<'a> &'a T: Add<&'a T, Output = T>,
T: PartialOrd,
T: Clone
{
type Item = T;
#[inline]
fn next(&mut self) -> Option<T> {
if self.0 < self.1 {
let v = self.0.clone();
self.0 = &v + &self.2;
Some(v)
} else {
None
}
}
}
fn main() {
for i in StepRange(0u64, 10u64, 2u64) {
println!("{}", i);
}
}
U
,您可以使用支持与不同类型相加并仍产生 T
的类型。例如时间和持续时间。 - Ryanfor (auto i = 0; i <= n; i += 2) {
//...
}
您可以像下面这样在Rust中编写:
let mut i = 0;
while i <= n {
// ...
i += 2;
}
如果您要按照预定义的步长(如2)进行迭代,可以使用迭代器手动迭代。例如:
let mut iter = 1..10;
loop {
match iter.next() {
Some(x) => {
println!("{}", x);
},
None => break,
}
iter.next();
}
let mut iter = 1..10;
let step = 4;
loop {
match iter.next() {
Some(x) => {
println!("{}", x);
},
None => break,
}
for _ in 0..step-1 {
iter.next();
}
}
for
和 step_by
? - Sergio Tulentsev
(11..=1).step_by(-2)
(从11到1(包括)的奇数递减),你必须执行(1..12).step_by(2).rev()
,这不太直观。 - BallpointBen