RefCell

RefCell は、実際には Rust の参照ではない &T/&mut T をエミュレートする代替型 RefRefMut を提供することで、ラップされた値へのアクセスと変更を可能にします。

これらの型は、RefCell 内のカウンターを使って動的チェックを行い、別の Ref/RefMut と同時に RefMut が存在しないようにします。

DerefRefMut については DerefMut も)を実装することで、これらの型は参照を外へ逃がすことなく、内部の値に対してメソッドを呼び出せます。

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::cell::RefCell;

fn main() {
    // `cell` は可変として宣言されていないことに注意してください。
    let cell = RefCell::new(5);

    {
        let mut cell_ref = cell.borrow_mut();
        *cell_ref = 123;

        // これは実行時エラーを引き起こします。
        // let other = cell.borrow();
        // println!("{}", other);
    }

    println!("{cell:?}");
}
  • RefCell は、Rust の通常の借用規則(複数の共有参照、または 1 つの排他的参照のいずれか)をランタイムチェックで強制します。この場合、すべての借用は非常に短く、互いに重ならないため、チェックは常に成功します。

  • この例の追加のブロックは、セルを表示する前に、borrow_mut の呼び出しで作られた借用を終了させるためのものです。借用中の RefCell を表示しようとすると、"{borrowed}" というメッセージが表示されるだけです。

さらに調べる

初回使用時の初期化を可能にする OnceCellOnceLock もあります。これらを有効に活用するには、現時点の受講者がまだ持っていない、もう少し多くの知識が必要です。