RefCell
RefCell は、実際には Rust の参照ではない &T/&mut T をエミュレートする代替型 Ref と RefMut を提供することで、ラップされた値へのアクセスと変更を可能にします。
これらの型は、RefCell 内のカウンターを使って動的チェックを行い、別の Ref/RefMut と同時に RefMut が存在しないようにします。
Deref(RefMut については 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}"というメッセージが表示されるだけです。
さらに調べる
初回使用時の初期化を可能にする OnceCell と OnceLock もあります。これらを有効に活用するには、現時点の受講者がまだ持っていない、もう少し多くの知識が必要です。