rust Cell 与 RefCell的区别
2022/2/20 6:29:36
本文主要是介绍rust Cell 与 RefCell的区别,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Cell与RefCell 的相同点:绕开所有权的限制,实现内部可变性性
rust 的所有权规则:
- 只能由一个可变引用
- 允许存在多个不可变引用
fn modify(a: &mut i32) { *x = *x + 1; } fn main() { let a = 111; modify(&mut a); }
变量a定义成一个不可变的变量,不能用于modify函数中,如果知道rust所有权规则,你一定会说直接改成let mut a = 111;
就完事了; 当存在即合理,有些场景是需要
允许对一个不可变变量进行修改的,这需要就需要Cell和RefCell出场了。
Cell主要是一些setter和getter的方法,比如set,get,replace,take, 但是呢,get的方法需要变量实现Copy trait,比如String类型没有实现Copy trait, 那么Cell::new(String::from("Hello")).get()
会报错,提示说没有实现Copy trait。
而replace,set,take则适用于String这种没有实现Copy trait的类型。一般来说,Cell内部实现会发生内存的分配,性能较之RefCell有点大。
RefCell提供了borrow_mut和borrow,调用这两个方法时,rust的运行时会检查所有权,比如borrow_mut调用时,类型已经存在了可变引用了,则会直接发生线程panic,因此提供了返回错误的版本:try_borrow_mut和try_borrow
总结一下
两者的共同点是为了突破可变引用和引用不能共存的问题,不同点是:
- Cell 是操作T(values), RefCell操作&T(references)
- Cell 在编译器检查,运行时不会panic;RefCell在运行时检查,使用不当会发生panic
这篇关于rust Cell 与 RefCell的区别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15在使用平台私钥进行解密时提示 "私钥解密失败" 错误信息是什么原因?-icode9专业技术文章分享
- 2024-11-15Layui框架有哪些方式引入?-icode9专业技术文章分享
- 2024-11-15Layui框架中有哪些减少对全局环境的污染方法?-icode9专业技术文章分享
- 2024-11-15laydate怎么关闭自动的日期格式校验功能?-icode9专业技术文章分享
- 2024-11-15laydate怎么取消初始日期校验?-icode9专业技术文章分享
- 2024-11-15SendGrid 的邮件发送时,怎么设置回复邮箱?-icode9专业技术文章分享
- 2024-11-15使用 SendGrid API 发送邮件后获取到唯一的请求 ID?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 tags标签最多有多少个?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 怎么批量发送给多个人?-icode9专业技术文章分享
- 2024-11-15如何搭建web开发环境并实现 web项目在浏览器中访问?-icode9专业技术文章分享