Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a reverse ordered for loop in Rust?

Tags:

for-loop

rust

Editor's note: This question was asked before Rust 1.0 was released and the .. "range" operator was introduced. The question's code no longer represents the current style, but some answers below uses code that will work in Rust 1.0 and onwards.

I was playing on the Rust by Example website and wanted to print out fizzbuzz in reverse. Here is what I tried:

fn main() {     // `n` will take the values: 1, 2, ..., 100 in each iteration     for n in std::iter::range_step(100u, 0, -1) {         if n % 15 == 0 {             println!("fizzbuzz");         } else if n % 3 == 0 {             println!("fizz");         } else if n % 5 == 0 {             println!("buzz");         } else {             println!("{}", n);         }     } } 

There were no compilation errors, but it did not print out anything. How do I iterate from 100 to 1?

like image 421
Tybalt Avatar asked Aug 06 '14 21:08

Tybalt


People also ask

HOW DO FOR loops work in Rust?

A for loop's expression in Rust is an iterator that ​returns a series of values. Each element is one iteration of the loop. This value is then bound to variable and can be used inside the loop code to perform operations.

Does rust have for loops?

Rust supports four loop expressions: A loop expression denotes an infinite loop. A while expression loops until a predicate is false. A while let expression tests a pattern.


2 Answers

A forward loop is like this:

for x in 0..100 {     println!("{}", x); } 

And a reverse loop is done by calling Iterator::rev to reverse the order:

for x in (0..100).rev() {     println!("{}", x); } 
like image 168
Luxspes Avatar answered Sep 30 '22 00:09

Luxspes


Editor's note: This question refers to parts of Rust that predate Rust 1.0. Look at other answers for up to date code.

Your code doesn't work because a uint of value -1 is equal the maximum value of uint. The range_step iterator stops immediately upon detecting overflow. Using an int fixes this.

std::iter::range_step(100i, 0, -1) 

You can also reverse an iterator with rev().

for n in range(0u, 100).rev() { ... } 

Though note that this will be from 99->0, rather than 100->1.

like image 44
A.B. Avatar answered Sep 29 '22 23:09

A.B.