rust - Rc 和有什么不一样> 和 RefCell>?
问题描述
Rust 文档涵盖了Rc<RefCell<T>>
相当广泛的内容,但没有涉及到RefCell<Rc<T>>
我现在遇到的 .
这些是否有效地给出了相同的结果?它们之间有重要的区别吗?
解决方案
这些是否有效地给出了相同的结果?
它们非常不同。
Rc
是一个共享所有权的指针,同时RefCell
提供内部可变性。它们的组成顺序对它们的使用方式有很大的影响。
通常,您将它们组合为Rc<RefCell<T>>
; 整个事情都是共享的,每个共享所有者都可以改变内容。Rc
由于内部数据是共享的,因此外部的所有共享所有者都将看到改变内容的效果。
您不能通过RefCell<Rc<T>>
引用共享 except,因此此配置在使用方式上受到更多限制。为了改变内部数据,你需要可变地从外部借用RefCell
,但是你可以访问一个不可变 Rc
的。改变它的唯一方法是用完全不同的Rc
. 例如:
let a = Rc::new(1);
let b = Rc::new(2);
let c = RefCell::new(Rc::clone(&a));
let d = RefCell::new(Rc::clone(&a));
*d.borrow_mut() = Rc::clone(&b); // this doesn't affect c
没有办法改变a
和中的值b
。这似乎远不如Rc<RefCell<T>>
.
推荐阅读
- android - android kotlin 数据绑定 kapt 丢失
- macos - 无法验证您的申请。我们无法创建身份验证会话
- javascript - 通过 FTP 到 JSON 的不完整 CSV
- r - 检索一组具有唯一子字符串的字符串
- paypal - 将 PayPal 支付与用户支付给另一个用户 (PHP) 集成
- javascript - JS数组在读取时被布尔值覆盖
- html - 将剪辑路径位置移动到鼠标光标
- swift - 如何将 UIImage (PNG) 转换为 BMP (B/W = 1 bit)
- python - 在 Python 3 中打开 2 个文件并将它们分配给 2 个 Set
- sql - 使用 MySQL 或 SparkDataframe 以不同的方式透视行