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を真偽値として扱う暗黙変換はありません。
直し方: 1 を true にします。
広告
広告スロット(未設定)
パターン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値を書く必要があります。
直し方: 0 を false にします。
パターン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でコンパイルエラーになります。
直し方: 1 を true にします。
パターン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型になるので、条件式にはそちらを使う必要があります。
直し方: 1 を true にします。
パターン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ではコンパイルエラーになります。
直し方: 0 を true にします。
よくある誤解
「0はfalse、0以外はtrueとして扱われるはず」という思い込みは誤りです。Rustには数値からboolへの暗黙変換が無いため、比較演算子を使って明示的にbool値を作る必要があります。
まとめ
if の条件式に整数を渡すと E0308(expected bool)になるは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。