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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。