【Rust】for文にて、降順で処理する方法

Rustのfor文ですが、C++等の今までの言語とは書き方が異なる為、降順となるとどう書けば良いのか分からなくなる事もあるかもしれません。

 

今回は、Rustでのfor文(昇順・降順)の書き方の一例を、C++と合わせて説明します。

 

1: <昇順> C++での書き方

2: <昇順> Rustでの書き方

1: <降順> C++での書き方

2: <降順> Rustでの書き方

 

 


【<昇順> C++での書き方】

C++でのfor文の書き方です。お馴染みですが、昇順で書いてみましょう。

 

#include <iostream>

using namespace std;

int main(void){

    string str = ", ";
    
    for (int i = 0; i < 10; i++) {
	cout << i + 1;
	if (i == 9) {
	    cout << "\n";
	} else {
	    cout << str;
	}
    }

    return 0;
}

出力結果は下記となります。

1, 2, 3, 4, 5, 6, 7, 8, 9, 10

特に説明は不要ですね。

 

 


【<昇順> Rustでの書き方】

Rustで書いてみます。出力結果こそ同じですが、C++とは処理方法を若干変えました。

 

fn main(){
    let min_val: i32 = 0;
    let max_val: usize = 10;
    let str: &str = ", ";

    for i in min_val..5 {
        print!("{}{}", i + 1, str);
    }

    for i in 5..max_val {
        if i == 9 {
            println!("{}", i + 1);
        } else {
            print!("{}{}", i + 1, str);
        }
    }
}

for文を2回に分けた理由ですが、スタート値とエンド値に変数を加える際の書き方と、型の変化を説明したいのが狙いです。

 

let min_val: i32 = 0;
let max_val: usize = 10;

min_val と max_val でそれぞれ型を変えていますが、実はfor文の i 変数は、スタート値及びエンド値に変数が使われていると、その変数の型に自動的に変化します。また、両者の変数の型が違う場合は、スタート値の変数の型が優先されます

 

for i in min_val..5 {
    ...
}

min_val 変数がスタート値で、「5」がエンド値です。ここでは、i 変数が 0 から 4 の範囲で値が増えていきます。また、ここでの i 変数の型は『 i32 』です。

 

for i in 5..max_val {
    ...
}

今度は「5」がスタート値で、max_val 変数がエンド値です。ここでは、i 変数が5 から 9 の範囲で値が増えていきます。要は最初のfor文の続きですね。そして、ここでの i 変数の型は『 usize 』となります。

 

 


【<降順> C++での書き方】

C++での降順の書き方の一例です。

 

#include <iostream>

using namespace std;

int main(void){

    int value = 10;
    string str = ", ";
    
    for (int i = value; i > 0; i--) {
	cout << i;
	if (i == 1) {
	    cout << "\n";
	} else {
	    cout << str;
	}
    }

    return 0;
}

出力結果は下記となります。

10, 9, 8, 7, 6, 5, 4, 3, 2, 1

アナログみたいに i 変数の初期値や減算等、各項目の設定を明確に変える必要がありますが、そのおかげで処理の様子は実に分かりやすいと思います。

 

 


【<降順> Rustでの書き方】

Rustで書いてみます。出力結果は同じですが、結構ややこしいです。

 

fn main(){
    let min_val: i8 = 0;
    let max_val: i32 = 10;
    let str: &str = ", ";

    for i in (5..max_val).rev() {
        print!("{}{}", i + 1, str);
    }

    for i in (min_val..5).rev() {
        if i == 0 {
            println!("{}", i + 1);
        } else {
            print!("{}{}", i + 1, str);
        }
    }
}

rev() 関数を用いる事で降順となるのですが、あくまで i 変数の処理範囲の書き方は同じである事を注意して下さい。

 

for i in (5..max_val).rev() {
    ...
}

ここの解釈ですが、処理範囲の書き方は同じなので、i 変数は、

9, 8, 7, 6, 5

の順で変異します。よって、出力の際には i に 1 を加算しておかないと結果が異なります。

 

for i in (min_val..5).rev() {
    ...
}

ここもですが、処理範囲の書き方は同じなので、i 変数は、

4, 3, 2, 1, 0

の順で変異します。よって、出力の際には i に 1 を加算しておかないと同じく結果が異なります。

出力結果はC++と同様、下記となります。

10, 9, 8, 7, 6, 5, 4, 3, 2, 1

 

基本的なRustでのfor文の例を載せましたが、慣れないと理解には多少手こずるかもしれませんね。

 

以上です。