やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rustのif式

 C言語などとほぼ同じだが、式を返せるのが大きな違いか。(三項演算子も兼ねる)

成果物

コード

fn main() {
    if true { println!("if");}

    if false { println!("if");}
    else { println!("else");}

    if false { println!("if");}
    else if true { println!("else if 1");}
    else if true { println!("else if 2");}
    else if true { println!("else if 3");}
    else { println!("else");}

//    if 1 { println!("if 1");} // error[E0308]: mismatched types

    let v = if true { 5 } else { 6 };
    println!("v = {}", v);
//    let v = if true { 5 } else { "six" }; // error[E0308]: if and else have incompatible types
}

三項演算子

let v = if true { 5 } else { 6 };

 if式+式は三項演算子とおなじ機能。表記もif式とおなじので読みやすい。Rustは関数の終わりに式を指定することで値を返せる、というルールがあるのでわかりやすい。

 それにひきかえ、C言語Python三項演算子は統一されていないので読みにくい。でも、こっちのほうが少しだけ短く書ける。

実行

$ rustc main.rs
$ ./main
if
else
else if 1
v = 5

エラー

条件式に整数値を用いる

 条件はboolでないとダメ。C言語のように整数値(0=false, 他=true)は使えない。

fn main() {
    if 1 { println!("if 1");} // error[E0308]: mismatched types
}
error[E0308]: mismatched types
  --> main.rs:12:8
   |
12 |     if 1 { println!("if 1");}
   |        ^ expected bool, found integer
   |
   = note: expected type `bool`
              found type `{integer}`

error: aborting due to previous error

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

letifを使うとき、型が統一されていない

 型はif, else, else ifで同じでないとダメ。Rustの変数は必ずある特定の型でなければならない。(静的型付け)

fn main() {
    let v = if true { 5 } else { "six" }; // error[E0308]: if and else have incompatible types
}
error[E0308]: if and else have incompatible types
  --> main.rs:19:34
   |
19 |     let v = if true { 5 } else { "six" };
   |                       -          ^^^^^ expected integer, found &str
   |                       |
   |                       expected because of this
   |
   = note: expected type `{integer}`
              found type `&str`

error: aborting due to previous error

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

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで