初級のRustエラー 70問
14種類のエラーを、それぞれ複数パターンずつ収録しています。
- E0384: cannot assign twice to immutable variable の原因と直し方Rustの変数はデフォルトで不変(immutable)です。letで宣言した変数に後から再代入しようとすると、コンパイル時にE0384エラーになります。
- E0308: mismatched types(型の不一致)の原因と直し方変数の型注釈と実際に代入する値の型が食い違うと、コンパイル時にE0308エラーになります。Rustは暗黙の型変換を行わないため、型はすべて一致している必要があります。
- 末尾にセミコロンを付けると戻り値が () になり E0308 になるRustの関数は最後の行が式(セミコロン無し)であれば、その値をそのまま戻り値にします。セミコロンを付けるとその行は文(statement)になり、戻り値が空のタプル()に変わってしまいます。
- index out of bounds パニックの原因と直し方存在しない添字でVecや配列にアクセスすると、コンパイルは通りますが実行時にパニックしてプログラムが異常終了します。
- called `Option::unwrap()` on a `None` value パニックの原因と直し方Option<T>型の値がNoneのときにunwrap()を呼び出すと、パニックが発生してプログラムが異常終了します。findやgetなど、見つからない可能性のある操作の戻り値はOptionになります。
- called `Result::unwrap()` on an `Err` value パニックの原因と直し方文字列を数値に変換するparse()などはResult<T, E>型を返します。変換に失敗してErrになった状態でunwrap()を呼ぶと、パニックが発生します。
- E0382: borrow of moved value(ムーブ後の値の使用)の原因と直し方StringやVecのようにCopyトレイトを実装しない値を別の変数に代入すると、所有権が移動(ムーブ)します。ムーブ後に元の変数を使おうとすると、コンパイル時にE0382エラーになります。
- E0369: cannot add `&String` to `&str` の原因と直し方文字列リテラル(&str)を左側にして+で連結しようとすると、+演算子がStringの左辺にしか実装されていないためE0369エラーになります。
- E0425: cannot find value in this scope の原因と直し方宣言していない変数名を参照すると、コンパイル時にE0425エラーになります。変数名のタイプミスが典型的な原因です。
- 整数同士の割り算 / が小数にならず切り捨てられるi32同士の/演算子は、商の整数部分だけを返します。小数点以下は切り捨てられ、割り切れなくても整数のままです。
- attempt to divide by zero パニックの原因と直し方整数を0で割ると、実行時にパニックが発生しプログラムが異常終了します。0になりうる値は、割り算の前に事前チェックが必要です。
- E0596: cannot borrow as mutable の原因と直し方mutを付けずに宣言した変数を、&mutで可変参照として渡そうとするとE0596エラーになります。値を変更する関数に渡す変数は、宣言時からmutにしておく必要があります。
- E0061: this function takes N arguments but M were supplied の原因と直し方関数が定義している数と異なる数の引数を渡すと、コンパイル時にE0061エラーになります。引数を1つ多く渡した、あるいは渡し忘れたことが典型的な原因です。
- if の条件式に整数を渡すと E0308(expected bool)になるC言語やJavaScriptと違い、Rustのif文の条件式には真偽値(bool)しか書けません。0や1のような整数をそのまま条件に置くとE0308エラーになります。