Code Fix

初級

if の条件式に整数を渡すと E0308(expected bool)になる

C言語やJavaScriptと違い、Rustのif文の条件式には真偽値(bool)しか書けません。0や1のような整数をそのまま条件に置くとE0308エラーになります。

エラーメッセージの読み方

error[E0308]: mismatched types
E0308
エラーコード — `rustc --explain E0308` で詳しい説明が見られます
mismatched types
詳細メッセージ — 何が問題だったか

このエラーが出る典型パターン

パターン1

 1  fn main() {
 2      let flag = 1     ;
                      ^
 3      if flag {
 4          println!("yes");
 5      }
 6  }
error[E0308]: mismatched types expected `bool`, found integer

Rustのif条件式にはbool型しか書けません。整数の0/1を真偽値として扱う暗黙変換はありません。

直し方: 1true にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  fn main() {
 2      let is_ready = 0      ;
                          ^
 3      if is_ready {
 4          println!("go");
 5      }
 6  }
error[E0308]: mismatched types expected `bool`, found integer

C言語のように0をfalse扱いする慣習はRustには無く、明示的にbool値を書く必要があります。

直し方: 0false にします。

この問題を解いてみる →

パターン3

 1  fn main() {
 2      let active = 1    ;
                       ^
 3      if active {
 4          println!("running");
 5      }
 6  }
error[E0308]: mismatched types expected `bool`, found integer

整数をそのままif条件に置くと、型が合わずE0308でコンパイルエラーになります。

直し方: 1true にします。

この問題を解いてみる →

パターン4

 1  fn main() {
 2      let done = 1     ;
                      ^
 3      if done {
 4          println!("finished");
 5      }
 6  }
error[E0308]: mismatched types expected `bool`, found integer

比較演算子(==など)の結果はbool型になるので、条件式にはそちらを使う必要があります。

直し方: 1true にします。

この問題を解いてみる →

パターン5

 1  fn main() {
 2      let ok = 0   ;
                   ^
 3      if ok {
 4          println!("passed");
 5      }
 6  }
error[E0308]: mismatched types expected `bool`, found integer

数値のままif文に渡すのはJavaScriptやPythonの感覚ですが、Rustではコンパイルエラーになります。

直し方: 0true にします。

この問題を解いてみる →

よくある誤解

「0はfalse、0以外はtrueとして扱われるはず」という思い込みは誤りです。Rustには数値からboolへの暗黙変換が無いため、比較演算子を使って明示的にbool値を作る必要があります。

まとめ

if の条件式に整数を渡すと E0308(expected bool)になるは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)