Rust标准库文档指出,`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
类型一起使用,可以避免运行时借用检查的开销。我有什么遗漏吗?
Clone
涉及实际运行代码,并且在运行时可能会出现错误。 - DK.