Code Fix

初級

E0308: mismatched types(型の不一致)の原因と直し方

変数の型注釈と実際に代入する値の型が食い違うと、コンパイル時にE0308エラーになります。Rustは暗黙の型変換を行わないため、型はすべて一致している必要があります。

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

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

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

パターン1

 1  fn main() {
 2      let count: i32 = "five";
                            ^
 3      println!("{}", count);
 4  }
error[E0308]: mismatched types expected `i32`, found `&str`

i32型と注釈した変数には整数リテラルしか代入できません。文字列は自動的に数値へ変換されません。

直し方: "five"5 にします。

この問題を解いてみる →

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

パターン2

 1  fn main() {
 2      let price: i32 = "hundred";
                             ^
 3      println!("{}", price);
 4  }
error[E0308]: mismatched types expected `i32`, found `&str`

Rustは静的型付け言語なので、型注釈と実際の値の型は一致していなければなりません。

直し方: "hundred"100 にします。

この問題を解いてみる →

パターン3

 1  fn main() {
 2      let temperature: f64 = "hot" ;
                                  ^
 3      println!("{}", temperature);
 4  }
error[E0308]: mismatched types expected `f64`, found `&str`

f64型にも文字列は代入できません。数値は数値リテラルとして書く必要があります。

直し方: "hot"36.5 にします。

この問題を解いてみる →

パターン4

 1  fn main() {
 2      let quantity: i32 = "three";
                               ^
 3      println!("{}", quantity);
 4  }
error[E0308]: mismatched types expected `i32`, found `&str`

型注釈で宣言したi32に対し、コンパイラは値の型が完全に一致しているかを厳密にチェックします。

直し方: "three"3 にします。

この問題を解いてみる →

パターン5

 1  fn main() {
 2      let distance: f64 = "far" ;
                               ^
 3      println!("{}", distance);
 4  }
error[E0308]: mismatched types expected `f64`, found `&str`

暗黙の型変換が無いRustでは、変数の型と代入する値の型を必ず一致させる必要があります。

直し方: "far"12.5 にします。

この問題を解いてみる →

よくある誤解

「動的型付け言語のように、変数には後からどんな型の値でも代入できるはず」という思い込みは誤りです。Rustは静的型付け言語で、一度型注釈を付けた変数には同じ型の値しか代入できません。

まとめ

E0308: mismatched types(型の不一致)の原因と直し方は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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