Документация стандартной библиотеки Rust утверждает, что Cell
может использоваться только для типов Copy
и что во всех остальных случаях следует использовать RefCell
, но не объясняет, почему именно.
Изучив документацию и код как Cell
, так и RefCell
, единственной точкой, которая кажется важной, является функция get
Cell
. Если значение является типом Copy
, то можно просто вернуть такую копию. Но почему клон недостаточно хорош?
Можно непосредственно реализовать функцию set
поверх RefCell
:
fn set<T>(r: &RefCell<T>, v: T) {
*r.borrow_mut() = v
}
Это работает только до тех пор, пока никто другой не держит ссылку на значение. Но если значение может быть клонировано, можно просто сделать это:
fn get<T: Clone>(r: &RefCell<T>) -> T {
r.borrow().clone()
}
Наличие типа Cell
, работающего с типами Clone
, позволит избежать накладных расходов на проверку времени выполнения. Я что-то пропустил здесь?