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 }
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 }
C言語のように0をfalse扱いする慣習はRustには無く、明示的にbool値を書く必要があります。
直し方: 0 を false にします。
パターン3
1 fn main() { 2 let active = 1 ; ^ 3 if active { 4 println!("running"); 5 } 6 }
整数をそのままif条件に置くと、型が合わずE0308でコンパイルエラーになります。
直し方: 1 を true にします。
パターン4
1 fn main() { 2 let done = 1 ; ^ 3 if done { 4 println!("finished"); 5 } 6 }
比較演算子(==など)の結果はbool型になるので、条件式にはそちらを使う必要があります。
直し方: 1 を true にします。
パターン5
1 fn main() { 2 let ok = 0 ; ^ 3 if ok { 4 println!("passed"); 5 } 6 }
数値のままif文に渡すのはJavaScriptやPythonの感覚ですが、Rustではコンパイルエラーになります。
直し方: 0 を true にします。
よくある誤解
「0はfalse、0以外はtrueとして扱われるはず」という思い込みは誤りです。Rustには数値からboolへの暗黙変換が無いため、比較演算子を使って明示的にbool値を作る必要があります。
実務での勘所
この制約は=と==の取り違えだけを防ぐためのものではありません。if (flags & MASK)のような、ビット演算の結果をうっかり条件として使ってしまうC言語系の事故も含めて、「boolでない値がなんとなく真偽として解釈される」という問題全体を1つのルールで防いでいます。さらにRustでは代入式自体が値を持たず()を返すだけなので、そもそもif (x = 5)のような代入と比較の取り違えという事故が構文的に成立しません。bool型を厳格に要求することは、複数の異なる種類のバグをまとめて塞ぐ、効率のよい安全策です。