上級のRustエラー 40問
8種類のエラーを、それぞれ複数パターンずつ収録しています。
- already borrowed: BorrowMutError パニックの原因と直し方RefCellは借用規則を実行時にチェックする仕組みです。borrow_mut()で可変借用した値がまだ生きている間に、もう一度borrow_mut()やborrow()を呼ぶとパニックします。
- E0782: trait objects must include the `dyn` keyword の原因と直し方トレイトを直接型として使おうとすると、コンパイル時のサイズが確定できないためエラーになります。トレイトオブジェクトとして扱いたい場合は、dynキーワードを付けてBox<dyn Trait>や&dyn Traitのようにポインタ経由にする必要があります。
- E0597: does not live long enough の原因と直し方ブロックの中で作った値への参照を、そのブロックの外に持ち出そうとするとE0597エラーになります。参照先の値は、参照そのものと同じかそれより長く生存していなければなりません。
- E0004: non-exhaustive patterns の原因と直し方match式は、値が取りうるすべてのパターンを網羅していなければコンパイルできません。一部のケースだけを書いて残りを省略すると、E0004エラーになります。
- as によるダウンキャストは警告なしで値を切り捨てるasによる整数の型変換(ダウンキャスト)は、変換先の型で表現できない値を警告もエラーもなく切り捨てます。300をu8にキャストすると、下位8ビットだけが残り44になります。
- ジェネリック関数に値を渡すと所有権がムーブされ2回使えないジェネリック型Tを所有権ごと受け取る関数に値を渡すと、Copyを実装していない型の場合は所有権がムーブされます。同じ値をもう一度渡そうとするとE0382エラーになります。
- E0284: type annotations needed の原因と直し方parse()のように戻り値の型がジェネリックで、文脈からも型を一意に決められない場合、E0284エラーになります。変数に明示的な型注釈を付けるか、parse::<i32>()のようにturbofish記法で型を指定する必要があります。
- E0507: cannot move out of ... which is behind a shared reference&で借りている構造体のフィールドを、所有権を要求する関数にそのまま渡そうとするとE0507エラーになります。参照の向こう側にある値は借りているだけなので、勝手に持ち出す(ムーブする)ことはできません。