gpt4 book ai didi

rust - 为什么 Rust 中的 Cell 只能用于 Copy 而不能用于 Clone 类型?

转载 作者:行者123 更新时间:2023-11-29 07:42:16 24 4
gpt4 key购买 nike

Rust 标准库的文档指出 Cell 只能用于 Copy 类型,在所有其他情况下应该使用 RefCell,但没有解释具体原因。

在研究了CellRefCell 的文档和代码之后,唯一重要的一点似乎是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 类型一起工作可以避免运行时借用检查的开销。我在这里遗漏了什么吗?

最佳答案

这是不合理的。 DK 的评论。是在正确的轨道上,但你甚至不需要 panic 就可以造成破坏。一个有问题的场景是这样的:

  1. 单元格(与 Option 一起)允许创建循环,即自引用类型
  2. Clone实现得到一个 &self引用
  3. 在存在循环的情况下,Clone因此,实现可以访问正在克隆的单元格
  4. 因此被克隆的对象可以覆盖自己,同时它有一个普通的借用给自己(即 &self )
  5. 在借用时覆盖是不合理的,因为它允许任意类型的双关语和其他不良行为。例如,假设有 Result<T, E>字段最初是 Ok(T) , 引用 T里面并覆盖ResultErr(R) .然后 &T突然提到一个E值(value)。

此示例归功于 Huon Wilson,请参阅 user.rust-lang.org 线程 Why does Cell require Copy instead of Clone? .他的文章深入探讨了这些限制的更多结构性原因,还包括一个完整的代码示例。

关于rust - 为什么 Rust 中的 Cell 只能用于 Copy 而不能用于 Clone 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39667868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com