MeWrite Docs

Rust: cannot borrow as mutable because it is also borrowed as immutable

Rustの借用チェッカーエラーの解決方法

概要

Rustの借用チェッカーが、同じデータに対する可変参照と不変参照の同時存在を検出した際に発生するエラーです。

エラーメッセージ

error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable

原因

  1. 同時借用: 不変参照が有効な間に可変参照を取得しようとした
  2. スコープの重複: 借用のスコープが重なっている
  3. ループ内の借用: イテレーション中にコレクションを変更しようとした

解決策

1. スコープを分離する

1
2
3
4
5
6
7
8
fn main() {
    let mut v = vec![1, 2, 3];
    {
        let first = &v[0];
        println!("First: {}", first);
    }
    v.push(4);
}

2. cloneを使用する

1
2
3
4
5
6
fn main() {
    let mut v = vec![1, 2, 3];
    let first = v[0].clone();
    v.push(4);
    println!("First: {}", first);
}

3. RefCellで内部可変性を使用

1
2
3
4
5
6
7
use std::cell::RefCell;

fn main() {
    let v = RefCell::new(vec![1, 2, 3]);
    let first = v.borrow()[0];
    v.borrow_mut().push(4);
}

よくある間違い

  • ループ内でコレクションを変更しようとする
  • 関数引数で可変参照と不変参照を同時に渡す

Rust の他のエラー

最終更新: 2025-12-09