Из std::cell документации, я вижу, что Cell "совместим только с типами, реализующими Copy". Это означает, что я должен использовать RefCell для типов не Copy.
Когда у меня есть тип Copy, есть ли преимущество использования одного типа ячейки над другим? Я предполагаю, что ответ "да", потому что в противном случае оба типа не существовали бы! Каковы преимущества и компромиссы использования одного типа над другим?
Вот глупый, составленный пример, который использует как Cell, так и RefCell для достижения той же цели:
use std::cell::{Cell,RefCell};
struct ThingWithCell {
counter: Cell<u8>,
}
impl ThingWithCell {
fn new() -> ThingWithCell {
ThingWithCell { counter: Cell::new(0) }
}
fn increment(&self) {
self.counter.set(self.counter.get() + 1);
}
fn count(&self) -> u8 { self.counter.get() }
}
struct ThingWithRefCell {
counter: RefCell<u8>,
}
impl ThingWithRefCell {
fn new() -> ThingWithRefCell {
ThingWithRefCell { counter: RefCell::new(0) }
}
fn increment(&self) {
let mut counter = self.counter.borrow_mut();
*counter = *counter + 1;
}
fn count(&self) -> u8 { *self.counter.borrow_mut() }
}
fn main() {
let cell = ThingWithCell::new();
cell.increment();
println!("{}", cell.count());
let cell = ThingWithRefCell::new();
cell.increment();
println!("{}", cell.count());
}