std::rc::Rc<T> と std::cell::RefCell<T>

Rc::borrow_mut の問題

let file = File::open("text.txt")?;
let mut bufreader = BufReader::new(&file);
let shared_reader = Rc::new(bufreader);

// NG
let _ = *shared_reader.borrow_mut().read_line(&mut line)?;

/*
error[E0599]: no method named `borrow_mut` found for struct `Rc<BufReader<&File>>` in the current scope
15  |     let _ = *shared_reader.borrow_mut().read_line(&mut line)?;
    |                            ^^^^^^^^^^ method not found in `Rc<BufReader<&File>>`
*/

直接Rc<T>にイミュータブルなFileインスタンスを包んでしまうと、borrow_mutメソッドが使用できない。

RefCell に包む

let refcell = RefCell::new(bufreader);

let shared_reader = Rc::new(refcell);

// OK
let _ = (*shared_reader.borrow_mut()).read_line(&mut line)?;