LoginSignup
0
0

More than 3 years have passed since last update.

分岐1(Rustの基本構文-5-)

Last updated at Posted at 2019-11-30

はじめに

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のほかにも分岐させるものはあるので次回記載する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0