プログラミング

Rustで条件分岐してみよう!

こんにちは、MSKです。
今回はRustで条件によって、処理を分岐させる方法について解説します。
プログラミングでは必ずと言っていいほど、条件分岐が出てきます。

過去の記事など

Rustの環境構築などは以下の記事を参考にしてください。

Rustをインストールして使ってみよう!仕事で使っているチップも今まではC言語のみ対応でしたが、近いうちにRustにも対応するといったアナウンスがでるなど組み込み系の仕事でも使用されるようになってきています。 今日はそのRustについて特徴を紹介し、定番の「Hello World」を表示したいと思います。...
Rustで変数を使ってみよう!Rustで変数を使うことについて解説を行います。...
Rustで関数を使ってみよう! こんにちは、MSKです。今回はRustで関数を扱ってみたいと思います。繰り返し使う処理をまとめることができるなど、ソースコードの可読性...

条件に合ったときに実行する

まずは簡単なサンプルをみてみます。

fn main() {
    let a = 10;

    if a % 2 == 0 {
        println!("{}は偶数です。",a);
    }
}

プログラムを書いたら、ターミナルからcargo buildとcargo runを行います。
10は偶数ですと表示されたらOKです。

条件分岐の部分は

if a % 2 == 0 {
    println!("{}は偶数です。",a);
}

の部分です。
分岐処理を行う時は、「if 条件式 {実行する処理}」と書きます。
条件式が正しければ、{}の中の処理が実行されます。

※C言語などではifの後の条件式には()をつける必要がありましたが、Rustでは必要ありません。

今回はa=10なので、2で割った余りが0になり条件が正しいので{}の中が実行され、コンソールに「10は偶数です。」と表示されます。

条件に合わなかったときも実行する

普通のプログラムでは条件にあう場合だけではなく、あわない場合も処理したいことがほとんどです。
簡単なサンプルをみてみたいと思います。

fn main() {
    let a = 11;

    if a % 2 == 0 {
        println!("{}は偶数です。",a);
    }
    else
    {
        println!("{}は奇数です。",a);
    }
}

実行すると「11は奇数です。」と表示されます。
条件式が正しくない場合に処理したい場合にはelse文を使用します。
「if 条件式 {条件式が正しい場合の処理} else {条件式が正しくない場合の処理} 」という形で使用します。
条件式が正しい場合は1つ目の{}の中の処理が、正しくない場合はelse後の{}の処理が実行されます。

サンプルではa=11なので、2で割った余りは1なので、else後の処理が実行されることになります。

たくさん分岐する

複数の分岐をする場合はelse文の後ろにif文をつけます。
サンプルをみてみます。

fn main() {
    let a = 2;
    let b = 2;

    if a > b {
        println!("aよりbが大きい。");
    }
    else if a == b {
        println!("aとbは等しい。");
    }
    else {
        println!("bよりaが大きい。");
    }
}

実行すると「aとbは等しい。」と表示されると思います。
else if 条件式 {実行する処理}を「if 条件式 {実行する処理} else if 条件式 {実行する処理} else {実行する処理}」というようにif else文の間に追加することで分岐を複数作ることができます。

サンプルではaとbが等しいので、else if a==bの処理が実行されます。
aとbの値を変えてみて、どちらが大きいかで処理が変わることを確認してみてください。

複数の条件を指定する

1つのif文の中に複数の条件を指定することができます。
サンプルを見てみましょう。

fn main() {
    let a = 22;
    if a % 2 == 0 && a > 10 {
        println!("{}は偶数で、10よりも大きい数字です。",a);
    }
    else {
        println!("{}は偶数ではない、または10以下の数字です。",a);
    }
}

実行すると、「22は偶数で、10よりも大きい数字です。」と表示されます。
if文の条件式に出てきている&&は論理積といいます。
if文の中で、論理積は前後の条件を同時に満たしている時に、その後の{}の中の処理が行われます。

今回のサンプルではa=22なので、偶数でかつ10よりも大きい数字です。
よって&&の前後の両方の条件を満たしますので、その後ろのprintlnが実行されています。

条件のどちらかを満たさないようにaを変更してみるとelseの方が処理されます。

論理積は前後の条件の両方を満たすときに実行されましたが、2つの条件の片方を満たせば実行されるようにしたいこともあります。
このような時には論理和「||」を使用します。
サンプルを見てみます。

fn main() {
    let a = 6;
    if a % 2 == 0 || a > 10 {
        println!("{}は偶数、または10より大きい数字です。",a);
    }
    else {
        println!("{}は偶数でなく、かつ10以下の数字です。",a);
    }
}

実行すると、「6は偶数、または10より大きい数字です。」と表示されると思います。

その他

関数をif文の中に入れる

返り値がbool型である関数はif文の中に入れることができます。
サンプルを見てみましょう。

fn is_even_number(a: i32)->bool {
    a % 2 == 0
}

fn main() {
    let a=24;
    if is_even_number(a) {
        println!("{}は偶数です。",a);
    }
    else {
        println!("{}は偶数ではありません。",a);
    }

実行すると「24は偶数です。」と表示されると思います。
if文の条件式はbool型であればよいので、このようにbool型を返す関数を含めることができるということです。

※bool型以外を返す関数を入れた場合はコンパイルエラーになります。
試しに以下のソースをコンパイルしてみます。

fn sum(a:i32 , b:i32)->i32 {
    a+b
}

fn main() {
    if sum(5,6) {
        println!("error");
    }
}

cargo buildすると次のようにエラーが出てくると思います。

error[E0308]: mismatched types
  --> src/main.rs:48:8
   |
48 |     if sum(5,6) {
   |        ^^^^^^^^ expected `bool`, found `i32`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.

To learn more, run the command again with --verbose.

if文で値を返す

最後はC言語でいうところの三項演算子を紹介します。
可読性を考えるとあんまり使わない方が良いと個人的には思います。
サンプルを見てみましょう。

fn main() {
    let a=11;
    let result = if a%2==0 {"偶数です。"} else {"奇数です"};
    println!("{}は{}",a,result);
}

実行すると「11は奇数です。」と表示されると思います。
「let 変数名 = 条件式 {条件式が正しい時に変数に格納する値} else {条件式が正しくない時に変数に格納する値}」という使い方をします。

この方法で注意しなければならないことは条件式の後の{}とelseの後の{}に記述する値が同じ型であることです。違う型、例えば{1} else {“hello”}とするとコンパイルエラーになります。

まとめ

Rustで条件分岐する方法について解説してきました
Rustで条件分岐するためには

  • 条件にあった処理を行う場合はif文
  • 条件に合った処理、合わない処理で分岐する場合はif-else文
  • 複数に分岐する場合はelse if文を条件の分だけ追加

を使います。

以上、「Rustで条件分岐してみよう!」でした。
最後までご覧いただき、ありがとうございました。

ABOUT ME
MSK
九州在住の組み込み系エンジニアです。 2児の父親でもあります。 数学やプログラミングが趣味です。 最近RustとReact、結び目理論と曲面結び目理論にはまっています。