Rust standard library的文档说明,Cell
只能用于Copy
种类型,在所有其他情况下,应该使用RefCell
,但没有确切解释原因.
在研究了Cell
和RefCell
的文档和代码之后,唯一重要的一点似乎是Cell
的get
函数.如果值是Copy
类型,则可以返回这样的副本.但为什么克隆人还不够好呢?
可以直接在RefCell
上实现set
功能:
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
个类型可以避免运行时借阅判断的开销.我有什么遗漏吗?