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