【笔记分享】`Cell`与`RefCell`的关联与差别

网友投稿 708 2022-11-24

【笔记分享】`Cell`与`RefCell`的关联与差别

【笔记分享】`Cell`与`RefCell`的关联与差别

​​Cell​​与​​RefCell​​有什么关联与差别

它们之间的相同点

它们都是【共享+可修改】容器数据结构,而不是【智能指针】,因为其没有实现​​Deref trait​​或​​DerefMut trait​​。它们都只能被使用在【单线程】环境下,因为其皆未实现​​Sync trait​​。它们都允许内部值​​T​​以受控方式被“修改”,虽然其已经同时被多个【只读-引用】所指向。

前者只能算是【替换】(内部值​​T​​)--- 【可修改】是就​​Cell​​自身而言的,​​Cell​​内部值变了(别管怎么变的),反正​​Cell​​的值就是不一样了。感觉它偷换概念,欺负我读书少后者才是【修改】--- 【可修改】是就内部值​​T​​所在内存地址上的内容而言的,内部值​​T​​的内存位置没有变,而是那个地址上的东西变了。这明显更高级对于​​Cell​​与​​RefCell​​,“修改”的含义不一样:它们提供的这个能力被统称为【内部可修改】。这是相较于普通​​rust​​类型的【继承可修改】而言。

它们仅只”打破“了传统的“【只读引用】不能与【可修改引用】共存”的限制。但是,在【同一时刻+同一作用域】内,【可修改引用】还至多只能有一个。否则,要么,编译错误;要么,运行时崩溃。

它们之间的不同点

上图的文字描述如下:

本质不同

​​Cell​​“包含”的是【所有权】变量本身​​RefCell​​​“包含”的是变量的【引用】。即便​​RefCell::new(...)​​构造函数的实参是【所有权】变量,这也不影响其内部重点使用该变量的【内存地址】。

衍生不同

检查时间点

运行时,确保:对内部值【临时的+排他的+可修改的】访问​​Cell​​编译时,代码静态扫描,借入检查​​RefCell​​运行时,动态跟踪,借入检查

违背【借入规则】的后果​​Cell​​违背【借入规则】的代码会导致【编译失败】​​RefCell​​违背【借入规则】的代码会导致【运行时-程序崩溃​​panic​​】计算成本​​Cell​​编译时成本​​RefCell​​运行时成本读取【容器数据结构】内部值要么,将【内部值】复制出来。比如,要么,将【内部值】置换出来。比如,要么,“杀鸡取卵”将【容器数据结构】“消费​​consume​​”掉,再将【内部值】真取出来。比如,​​Cell::get()​​​​Cell::take()​​以类型默认值置换出来​​Cell::replace()​​以指定的值置换出来​​Cell::into_inner()​​​​Cell​​​​RefCell​​就三步:

通过【运行时-借入检查器】的审查​​RefCell::borrow()​​取出变量的内存地址​​*RefCell::borrow()​​以【去引用-操作符】取出该地址位置上被保存的值。

修改【容器数据结构】内部值:​​Cell::replace()​​以【新】值置换出【旧】值​​Cell::set()​​放入【新】值而直接丢弃【旧】值​​Cell​​​​RefCell​​

通过【运行时-借入检查器】的审查​​RefCell::borrow_mut()​​取出变量的内存地址​​*RefCell::borrow_mut()​​以【去引用-操作符】修改该地址位置上被保存的值。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:简单的Asp.net core管道模拟
下一篇:Harbor配置https访问
相关文章

 发表评论

暂时没有评论,来抢沙发吧~