はじめに

Rustの基本的な文法についてまとめてみた。第5回!
今回からはプログラムの構文として、様々なことに使われる「分岐」について。
C/C++, python ,java, rubyなどでも多くに使われる。

目的

Rustにおける基本的な構文の理解をする。

Rustの基本構文シリーズ

第1回⇒Rustの基本構文(1)  URL:https://qiita.com/jin237/items/b344d3a7e6dfe1056e31
第2回⇒Rustの基本構文(2)  URL: https://qiita.com/jin237/items/6910b4f803a35f317213
第3回⇒Rustの基本構文(3)  URL:https://qiita.com/jin237/items/59ef229a4de30cb8203b
第4回⇒Rustの基本構文(4)  URL: https://qiita.com/jin237/items/42249f984746711be0e2

演算子

先に演算子について軽くまとめておく。他の言語における演算記号などとほぼほぼ一緒である。

四則演算に関して

・”+”は加法(足し算)を示す。
・”-“は減法(引き算)を示す。
・”*”は乗法(掛け算)を示す。
・”/”は除法(割り算)を示す。
ここで、計算プログラムで注意が必要である。

let answer = 70 + 8.9;
println!("70 + 8.9 = {}", answer);

という簡単そうな計算でもこのコードだと下記のようなエラーが出てくる。

[Running] cd "c:\Users\[username]\rust\project1\" && rustc culc1.rs && "c:\Users\[username]\rust\project1\"culc1
error[E0277]: cannot add a float to an integer
 --> culc1.rs:2:21
  |
2 |     let answer = 70 + 8.9;
  |                     ^ no implementation for `{integer} + {float}`
  |
  = help: the trait `std::ops::Add<{float}>` is not implemented for `{integer}`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.

これは浮動小数点数にそろえることによりエラーの解消ができる。

let answer = 70.0 + 8.9;
println!("70.0 + 8.9 = {}", answer);

このコードでしっかりと動く。
これには気を付けたい。

if式による分岐(基礎構文)

基礎的な構文については、以下のような書き方となる。(ほかの言語と似ている)

例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.230-例1)

基本となる構文(例1)

if 条件式{
     条件がtrueの場合に実行される節(true節)
} else {
     条件がfalseの場合に実行される節(false節)
}
fn main(){
  let a = 11;
  if a %2 == 0{
      println!("{} is an even number", a);
  } else {
      println!("{} is an odd number", a);
  }
}

結果が下記

11 is an odd number

[Done] exited with code=0 in ____ seconds

のように、a=11とおいて数に対して、偶数と奇数の判定ができる。これはどのプログラム言語でも同じように書くことができる。ちなみに、”even number”が偶数、”odd number”が奇数となる。
他言語だと上のように書く様式が多いが、あくまで、if 条件式なので、式で表すこともできる。
書き方を変えると以下のようにもできる。

例1の書き換え(例2)

fn main(){
    let a = 11;
    let even_or_odd = if a % 2 == 0{
        "an even"
    } else {
        "an odd"
    };

    println!("{} is {} number", a, even_or_odd);
}

このプログラムは、変数aの11(奇数)によってeven_or_odd変数が”an odd”に束縛される。これより、結果は以下のように表示される。

11 is an odd number   //result

ここで注意が必要なのが、if式には戻り値が存在(今回の場合は()となる)し、true節、false節のどちらも戻り値の型は同様でないといけないということ。ちなみに例1でのif式の後に”;”がないがこれはミスではなく戻り値が”()”の場合には特例によって省くことができる。

if式でできないこと

例を引用してくる。(from 実践Rust入門 言語仕様から開発手法まで P.232-例3)

fn main(){
    let a = 13;

    let result = if a % 2 == 0{
        'E'
    } else {
        "AN ODD"
    };
}

という処理を行う。これは、
true処理⇒char型
false処理⇒str型
という処理を行っていますが、result変数での型の確定ができない。rustのif式においてこういった使い方はできない。前述に追記して、戻り値の型も同じでなければならない。よって下記のようなErrorが起こってしまう。

[Running] cd "c:\Users\[username]\rust\project1\" && rustc even_or_odd.rs && "
[Running] cd "c:\Users\[username]\rust\project1\" && rustc if_function.rs && "c:\Users\[username]\rust\project1\"if_function
error[E0308]: if and else have incompatible types
 --> if_function.rs:7:9
  |
4 |       let result = if a % 2 == 0{
  |  __________________-
5 | |         'E'
  | |         --- expected because of this
6 | |     } else {
7 | |         "AN ODD"
  | |         ^^^^^^^^ expected char, found &str
8 | |     };
  | |_____- if and else have incompatible types
  |
  = note: expected type `char`
             found type `&str`

追記

if式において、true節のみで戻り値が”()”となる場合、false節を省いても、falseの戻り値が”()”となる。

let a = 11;
if a % 2 == 0;{
    println!("{} is an odd number", a);
}

とも記述することができる。

さいごに

if式についての記事を書いてみた。多少間違っているところもあるかもしれないので、ぜひ指摘してほしい。ifのほかにも分岐させるものはあるので次回記載する。