Rust标准库的文档声明Cell只能用于Copy类型,并且在所有其他情况下应该使用RefCell,但不能解释原因.
研究文件和两者的代码后Cell和RefCell,它似乎是唯一重要的一点是get功能Cell.如果值是一个Copy类型,则可以返回这样的副本.但为什么克隆不够好?
可以直接在以下位置实现该set功能RefCell:
fn set<T>(r: &RefCell<T>, v: T) {
*r.borrow_mut() = v
}
Run Code Online (Sandbox Code Playgroud)
这只有在没有其他人持有对该值的引用时才有效.但如果可以克隆该值,可以这样做:
fn get<T: Clone>(r: &RefCell<T>) -> T {
r.borrow().clone()
}
Run Code Online (Sandbox Code Playgroud)
使用类型Cell处理Clone类型可以避免运行时借用检查的开销.我在这里错过了什么吗?
小智 10
它不健全.DK的评论.是在正确的轨道上,但你甚至不需要恐慌造成破坏.一个有问题的情况是:
Option)允许创建循环,即自引用类型Clone实施得到一个&self参考Clone实现可以因此访问正被克隆的单元&self)Result<T, E>字段,其最初Ok(T),取到的基准T内部并覆盖Result用Err(R).然后&T突然提到一个E值.这个例子可以归功于Huon Wilson,请参阅user.rust-lang.org主题为什么Cell需要Copy而不是Clone?.他的文章介绍了限制的更多结构性原因,并包括一个完整的代码示例.