問題一覧に戻る
中級スマートポインタ
問題82: RefCell

RefCell'<'T'>'は内部可変性を提供 - 不変な値を可変にできるパターンです。コンパイル時ではなく実行時に借用ルールを強制します。borrow()で不変アクセス、borrow_mut()で可変アクセス。RcとRefCellを組み合わせると複数の所有者が共有データを変更できます。借用ルール違反でパニックします。

use std::cell::;

fn main() {
// RefCellの作成
let value = ::new(5);

// 不変借用
let borrowed = value.();
println!("value: {}", *borrowed);
drop(borrowed);

// 可変借用
let mut mut_borrowed = value.();
*mut_borrowed += 10;
println!("new value: {}", *mut_borrowed);
drop(mut_borrowed);

// Rcを使った複数の所有者
use std::rc::Rc;
let shared = Rc::new(RefCell::new(0));
let a = Rc::clone(&shared);
let b = Rc::clone(&shared);

// 共有参照を通した変更
*a.() += 1;
*b.borrow_mut() += 2;

println!("final: {}", *shared.());
}