Code Fix

上級

E0284: type annotations needed の原因と直し方

parse()のように戻り値の型がジェネリックで、文脈からも型を一意に決められない場合、E0284エラーになります。変数に明示的な型注釈を付けるか、parse::<i32>()のようにturbofish記法で型を指定する必要があります。

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

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

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

パターン1

 1  fn main() {
 2      let n      = "42".parse().unwrap();
               ^
 3      println!("{}", n);
 4  }
error[E0284]: type annotations needed

parseはジェネリックな戻り値を持ち、以降の使い方からも型が決まらない場合、型注釈が必要になります。

直し方: (空): i32 にします。

この問題を解いてみる →

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

パターン2

 1  fn main() {
 2      let value      = "100".parse().unwrap();
                   ^
 3      println!("{}", value);
 4  }
error[E0284]: type annotations needed

型注釈を付けるか、parse::<i32>()のようにturbofish記法で型を明示する必要があります。

直し方: (空): i32 にします。

この問題を解いてみる →

パターン3

 1  fn main() {
 2      let amount      = "250".parse().unwrap();
                    ^
 3      println!("{}", amount);
 4  }
error[E0284]: type annotations needed

文脈から型が一意に定まらない限り、コンパイラは戻り値の型を推論できずエラーになります。

直し方: (空): i32 にします。

この問題を解いてみる →

パターン4

 1  fn main() {
 2      let qty      = "7".parse().unwrap();
                 ^
 3      println!("{}", qty);
 4  }
error[E0284]: type annotations needed

parseはFromStrを実装しているあらゆる型に変換できる汎用的なメソッドなので、型指定が必須になる場面があります。

直し方: (空): i32 にします。

この問題を解いてみる →

パターン5

 1  fn main() {
 2      let level      = "3".parse().unwrap();
                   ^
 3      println!("{}", level);
 4  }
error[E0284]: type annotations needed

letに型注釈を付けるのが最もシンプルな解決方法で、他の型が欲しい場合はi32をf64などに変えるだけです。

直し方: (空): i32 にします。

この問題を解いてみる →

よくある誤解

「後で値を使っている箇所を見れば、コンパイラが型を逆算してくれるはず」という思い込みは誤りです。今回のようにその後の使い方が何も無い(あるいは曖昧な)場合、コンパイラは型を1つに絞り込めず、明示を要求します。

まとめ

E0284: type annotations neededは上級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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